変化を求める人

[bash]始めました。よくわからない箇所をメモ。わかる人は暇なときでいいので教えてくれると助かります。

      2016/07/25

bashを触り始めました。
挙動の違いが「なぜ」なのか、よくわからない処があったのでメモ。

この記事を作っている中で、一応、ある程度自分の中で結論は出たけど、あっているのだろうか。

配列の展開?

調べると、 ${array[@]} などはコマンドに「渡される前」に、シェルが展開しているとのこと。
また、セミコロンで囲う場合、展開され方に違いがでる。

右にあるコメントはシェルによって展開された形

“${array[@]}” では、要素を1個ずつ、セミコロンで囲う。
“${array[*]}” では、すべての要素が1つとして扱われる。
細かい違いがあるんだなあと。

で、少しいじっていたらある挙動に疑問が生じた。

IFS を変更し、echo で配列の中身を表示した際に、上記の考え方ではよくわからないことがあった。
そもそも、全くの見当違いかもしれないが、以下の挙動を確認した。

右にあるコメントは echo結果

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。

ということで、

配列の中身をソートする

こんな感じ

 - bash , ,

スポンサーリンク

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

関連記事はありませんでした