ieIFS
に設定しました。値を確認すると、二重引用符を使用しないと空白になります。x
IFS=x
IFS
~ $ echo $IFS | cat -e
$
~ $ echo "$IFS" | cat -e
x$
~ $ echo $HOME
/home/mar
~ $ echo "$HOME"
/home/mar
~ $
上記のように、$HOME
動作はこれと同じではありません。この行動の理由は何ですか?
答え1
変数が展開された後、単語分割が発生して空の単語に分割されます。分割は、変数の各文字を区切り文字として使用IFS
され、$IFS
の文字のみに拡張されるため、空のIFS
単語に分割されます。
たとえば、次のようになります。
IFS=xxx;
printf %q $IFS
''''''[root@localhost ~]#
二重引用符を使用すると、bashに引用符内のすべての内容を1つの単語として処理するように指示します。
printf %q "$IFS"
xxx[root@localhost ~]#
答え2
この内容が で言及された内容と関連があるようです。高度なバッシュスクリプトガイド
単語の区切りを防ぐには、二重引用符を使用してください。 [2]二重引用符で囲まれた引数は、スペース区切り文字が含まれていても、それ自体を単一の単語としてレンダリングします。
例(5.1)と組み合わせると、次のようになります。
var="'(]\\{}\$\""
echo $var # '(]\{}$"
echo "$var" # '(]\{}$" Doesn't make a difference.
IFS='\'
echo $var # '(] {}$" \ converted to space. Why?
echo "$var" # '(]\{}$"
答え3
ここで単語分割の問題を解決する別の方法は次のとおりです。
set | grep -w IFS=
出力デフォルトIFSは次のとおりです。
IFS=$' \t\n'
Stack Overflowで関連投稿を確認してください。