変数に関するメモ。 💤がついてるのはzsh 固有のもの。
- シェル変数 → 子プロセスに継承されない
- 環境変数 → 子プロセスに継承される
環境変数登録
export NEWENV=hogehoge
おまけ 環境変数の値を表示するコマンド
printenv 変数名
'...'
シングルクォート :内部での展開なし- オプション RC_QUOTES をセットしてる場合、内部で
''
が'
として展開される - 空白文字があっても単語分割では1語としてみなされる
- オプション RC_QUOTES をセットしてる場合、内部で
"..."
ダブルクォート : 内部での展開あり- グロッビング(
*
とか?
)は展開されない
- グロッビング(
$'...'
- printコマンドと同じエスケープシーケンスが使える
echo $'\e[4munderline'
-> underline
- printコマンドと同じエスケープシーケンスが使える
manのここ(14.3 Parameter Expansion) たくさんあります。 以下変数名を name とする。
- 変数が配列の場合は各要素を1単語としてすべての要素を並べた文字列に展開。ただしオプション KSH_ARRAYS がセットされている場合は、配列の先頭要素のみを展開する。
- 値の文字列に空白が含まれる場合、デフォルトでは語分割されない:zzz:
- 変数が定義済みの場合 1、定義されてなければ_0_に展開される。
- デフォルト値(代入なし)
-
は値が設定されていない場合、:-
は値がNULLの場合に _word_が展開される。
- デフォルト値(代入あり)
=
は値が設定されていない場合、:=
は値がNULLの場合に _word_が展開かつ代入される。::=
は変数に空文字以外の値が入ってる場合でも上書き代入する。
?
は値が設定されていない場合、:?
は値がNULLの場合に、 word をメッセージとして出力してシェルの実行を終了する。
+
値が設定されている場合、:+
値がNULLでない場合 word に展開される。
- 値の先頭が pattern で始まっていれば削除して展開する。
#
は最短マッチ。##
は最長マッチ。
- 値の末尾が pattern で始まっていれば削除して展開する。
%
は最短マッチ。%%
は最長マッチ。
- 値が pattern に完全マッチしていればすべて削除して展開する。
- 「配列値から特定の値を削除」したい場合とかに使える。
% echo $arr
a b c
% echo ${arr:#b}
a c
- arrayname は配列変数名
- 配列 name の要素から arrayname に存在する要素を除去する。
% food=(apple potato banana grape chiken)
% fruits=(apple banana grape melon)
% echo ${food:|fruits}
potato chiken
:|
の置換と同様。 こっちは 論理積。 両方に存在する要素のみ保持される。
% echo ${food:*fruits}
apple banana grape
-
2つの配列をzipする。 配列の要素が交互に選択される。
-
:^
短いほうの配列の長さ × 2 の配列が生成される。 -
:^^
長いほうの配列の長さ × 2 の配列が生成される。
% a=(a b c); b=(1 2)
% echo ${a:^b};
a 1 b 2
% echo ${a:^^b}
a 1 b 2 c 1
- bashから言葉を拝借すると 部分文字列展開。
- lengh 文字数を取り出す。 開始位置は offset で指定(先頭0)。
- 値のうち pattern にマッチする部分を new に置き換える。
/
は最初のマッチのみ、//
はマッチしたものすべて。:/
は_pattern_ が文字列全体にマッチした場合のみ 置き換えられる。- pattern に
/
を含ませたい場合は バックスラッシュを前置する。
echo $hoge
/hoge/hogehoge
% echo ${hoge/\/hoge/\/foo}
/foo/hogehoge
- 値の文字数(整数)に置換される。
- 値が配列の場合は要素数に置換される。
^
オプション RC_EXPAND_PARAM を一時的に有効化して展開。^^
オプション RC_EXPAND_PARAM を一時的に無効化して展開。
- 語分割の有効化
=
オプション SH_WORD_SPLIT を一時的に有効化して展開。==
オプション SH_WORD_SPLIT を一時的に無効化して展開(zshデフォルト)。
~
オプション GLOB_SUBST を一時的に有効化して展開。~~
オプション GLOB_SUBST を一時的に無効化して展開。
フラグを指定すると特別な展開処理を行える。
14.3.1 Parameter Expansion Flags (zsh)
書式:${(ここに記述)name}
補完も効きます。 ${(ここでTab or Ctrl-I
めっちゃある。。
以下一覧
記号 | 意味 |
---|---|
# | 結果の単語を数値式として評価する |
% | プロンプト文字列展開 と同じ%エスケープを展開する。 |
@ | 変数展開が "" 内で行われたとき、 個々の配列要素が別々の単語として展開される。 |
f | 改行文字(\n)で単語分割する(field spliting) ps:\n: の短縮形 |
F | 区切り文字に改行(\n)を使用して、配列の単語を結合する(fの逆) |
A | デフォルト値代入展開で配列パラメータを作成する(Array)AA とした場合は連想配列となる |
e | 結果に対してパラメータ拡張、コマンド置換、および算術展開を行う(eval) |
P | 展開結果を変数名とみなしてさらに展開(Parameter) |
k | 連想配列のキー配列を返す(keys) |
v | 連想配列の値を取り出す(values) k と併用する。 |
U | 展開結果のすべての英字を大文字に変換する(Upper) |
L | 展開結果のすべての英字を小文字に変換する(Lower) |
C | 展開結果を単語区切りで先頭大文字にする(Capitalize) 「単語」の単位は 英数時以外で区切られた一連の英数字を指す。 |
o | 結果の単語を昇順でソートする(order) |
O | 結果の単語を降順でソートする(oの逆) |
a | 配列インデックス順でソートする(array-order)O と組み合わせて配列逆順取得とか |
i | ソート時に大文字小文字を区別しない(ignore-case) |
n | 数値とみなしてソートする(number) |
q | 特殊文字をクォートする(quote)qq シングルクォートで括るqqq ダブルクォートで括るqqqq $' ' で括る |
Q | 結果の単語から1段階クォートを外す(qの逆) |
t | 変数の型を返す(type) |
u | 配列から重複除去(unique) |
c | ${#ARRAY}の時、すべての要素の文字数を加算した値が展開される デフォルトでは要素数 |
V | 制御文字等が含まれる場合に可視化(Visible) |
w | ${#VAR} で単語数を返す(words) |
W | w とほぼ同じ。連続した区切り文字間の空文字も1単語として数えられる。 |
X | Q , e 展開時やパターンマッチングで発生するエラーを報告する。 |
z | シェルの単語分割規則に従って結果を分割する。 |
p | j l r s と併用した場合、フラグの引数に printコマンドと同じエスケープシーケンスが使える。 |
j:string: | string を区切り文字として配列中の各単語を結合する(join) |
l:N::string1::string2 | 配列各要素が_N_ 桁になるように、単語の左側を埋める。 string1 は埋め込み文字(任意オプション) string2 は単語の左側に挿入される文字(任意オプション) |
m | 文字数カウントにバイト数を用いる |
r:N::string1::string2 | lと同様。 r の場合は右埋め |
s:string | string を区切り文字として単語分割する(split) |
S | ${~#~} と${~%~} 使用時に、 両側から検索をかける最長マッチを最短マッチに置き換える |
I:N: | 検索・置換時にマッチングをN番目のものに指定する。 |
B | マッチした文字列の先頭からのインデックスを返す(Beginning) 先頭のインデックスは1 |
E | マッチした文字列の末尾のインデックスを返す。(End) |
M | マッチした文字列だけを返す(Matched portion) |
N | マッチした文字列の長さを返す(leNgth) ← 強引w |
R | マッチしなかった部分を返す(Rest) |
man のここ(15.2.3 Subscript Flags)
配列を取り出すときに用いる。補完も効きます。
書式 name[(flags)exp]
以下一覧
記号 | 意味 |
---|---|
w | 添字付き変数が文字列の場合、単語単位での取り出し指定になる。 デフォルトの単語区切りは空白文字。 |
s:string | w フラグと併用する。 string に単語区切り文字列を指定。 |
p | s フラグよりも前に指定。 print コマンドと同じエスケープシーケンスが使える。 |
f | w フラグと同様。ただし 単語区切り文字が 改行文字。 |
r | 添字部分(書式の_exp_)にパターンを指定。 パターンにマッチする最初の要素を取得する |
R | r フラグと同様。 末尾から検索をかける。 |
i, I | r フラグと同様。ただしパターンにマッチしたインデックスを返す。i : 先頭から検索をかける。見つからなかった場合は、_配列の長さ+1_を返すI : 末尾から検索をかける。 見つからなかった場合は、0 を返す |
k,K | 連想配列の添字で使用する。 配列のキーをパターンとして解釈する。 マッチした最初のキーを取得する。 K は マッチした全ての値を返す。 |
n:expr: | r R i I フラグと組み合わせて使用する。 検索でマッチした expr 番目の要素を取得する。 見つからなかった場合は 空文字を返す。 |
b:expr: | r R i I フラグと組み合わせて使用する。 検索開始位置を expr 番目の要素とする。 |
e | パターンマッチングでプレーンストリングマッチングが使用される。* や@ が展開されない。 |
使ってみる
# w 単語単位取り出し
% var="red green yellow blue"
% echo ${var[3]}
d
% echo ${var[(w)3]}
yellow
# s 区切り文字指定
% var="red:green:yellow:blue"
% echo ${var[(ws,:,)3]}
yellow
# f 改行区切り
% echo "red\ngreen\nyellow\nblue" > file.txt
% echo ${$(<file.txt)[(f)3]}
yellow
# r R i I 検索
% var=(red green yellow blue)
% echo ${var[(r)?e*]} # 先頭から検索
red
% echo ${var[(R)?e*]} # 末尾から検索
yellow
% echo ${var[(i)?e*]} # 先頭から検索(インデックス返す)
1 # ※ zshでは 配列のインデックス先頭は 1 なのです
% echo ${var[(I)?e*]} # 末尾から検索(インデックス返す)
3
# n 取得インデックス指定
% echo ${var[(rn:1:)?e*]}
red
% echo ${var[(rn:2:)?e*]}
yellow
% echo ${var[(rn:0:)?e*]} # exprが0のときも1番目が取れるみたい
red
# b 開始位置指定
% echo ${var[(rb:2:)*e*]}
green
% echo ${var[(rb:2:)*e*]}
## k K キーマッチング (使い所が難しそう)
% typeset -A hash=('?' one '??' two '*' jango)
% echo ${hash[(k)A]}
jango
% echo ${hash[(k)AA]}
two
% echo ${hash[(K)AA]}
two jango
KSH_ARRAYSKSH_ARRAYS
配列の添字が0ベースとなる。 添字無しで展開した場合に、先頭要素だけ展開される。
# off
% echo arrays:${arr}, first:${arr[1]}
arrays:a b c, first:a
# on
% set -o ksharrays; echo arrays:${arr}, first:${arr[1]};
arrays:a, first:b
やってみたほうがわかりやすい。
% arr=(ee u oo)
#off
% echo s${^^arr}n
see u oon
#on
% echo s${^arr}n
seen sun soon
変数展開時に展開された値を空白文字で分割する。
onにした場合はbashと同じ動きになる。 参考はこちら
% word="one two three"
# off
% echo ${(qqq)==word}
"one two three"
# on
% echo ${(qqq)=word}
"one" "two" "three"
変数展開時に展開後の値でパス名展開する。
% files=./*;
# off
% echo ${~~files}
./*
#on
% echo ${~files}
./file.txt ./file2.txt