"echo $ IFS"はIFS値を返しません。

"echo $ IFS"はIFS値を返しません。

ieIFSに設定しました。値を確認すると、二重引用符を使用しないと空白になります。xIFS=xIFS

~ $ 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で関連投稿を確認してください。

関連情報