[bash]始めました。よくわからない箇所をメモ。わかる人は暇なときでいいので教えてくれると助かります。
2016/07/25
bashを触り始めました。
挙動の違いが「なぜ」なのか、よくわからない処があったのでメモ。
この記事を作っている中で、一応、ある程度自分の中で結論は出たけど、あっているのだろうか。
配列の展開?
調べると、 ${array[@]} などはコマンドに「渡される前」に、シェルが展開しているとのこと。
また、セミコロンで囲う場合、展開され方に違いがでる。
1 2 3 4 5 6 |
array=(a bb "cc c") ${array[@]} # a bb cc c ${array[*]} # a bb cc c "${array[@]}" # "a" "bb" "cc c" "${array[*]}" # "a bb cc c" |
“${array[@]}” では、要素を1個ずつ、セミコロンで囲う。
“${array[*]}” では、すべての要素が1つとして扱われる。
細かい違いがあるんだなあと。
で、少しいじっていたらある挙動に疑問が生じた。
IFS を変更し、echo で配列の中身を表示した際に、上記の考え方ではよくわからないことがあった。
そもそも、全くの見当違いかもしれないが、以下の挙動を確認した。
1 2 3 4 5 6 7 8 9 |
IFS=$'\n' # 区切りを改行のみに変更 array=(a bb "cc c") echo ${array[@]} # a bb cc c echo ${array[*]} # a bb cc c echo "${array[@]}" # a bb cc c echo "${array[*]}" # a # bb # cc c |
echo “${array[*]}” の動作は echo “a bb cc c” ではなく
echo -e “a\nbb\ncc c”と等価。(echo “a\nbb\ncc c” だと \n が文字としてそのまま出力される)
展開するといい具合にオプションもつけてくれるのか?
※追記
オプションとかではなくただ単に
echo “a
bb
cc c”
といった形になっている気がしてきた。
ただ、実際に改行するのと、メタ文字(\n)を入力することの違いがどのようになっているのかよくわからない。
echo が何かしているんですか? それともシェルが何か手を加えているんですか?
※ついでに
シェル上でタブを入力するには [Ctrl+v][Tab]
展開の挙動について、勘違い?していたこと
勘違い1. 要素はスペースで区切られている
IFS(Internal Field Separator)を変えれば、スペースとは限らない(IFSのデフォルトがスペース、タブ、改行らしい)
勘違い2. ある要素にスペースが含まれていた場合、 “${array[*]}” では1つの要素として扱われず、すべて一つになる
ちゃんと要素ごと区別はしている(最初は)。要素を区別し、要素間に区切り文字を挟んだうえで、最終的に一つになるっぽい。
(IFSを他の文字に変更しても同様に挟まれたことを確認)
これであってる?
で、そもそも何がしたかったのかというと、
配列の中身をsort。
ということで、
1 2 3 4 5 6 |
array=(bb ccc dddd a) _IFS=$IFS # 処理後は元に戻すためにバックアップしておく IFS=$'\n' # sort処理は行ごとの比較なので、要素ごとに改行させるために区切り文字を改行(\n)に変更 echo "${array[*]}" | sort # 「要素ごとに改行された」入力に対してsortを実行 IFS=$_IFS # 元に戻す |
こんな感じ
関連記事
関連記事はありませんでした
スポンサーリンク