$COMMAND
2番目のタブで区切られたフィールドを変数に保存したいのですが、$i
これによりコマンドがcd ~
実行されます。TEST_CASE_001
の間にタブ文字があります。cd ~
i='TEST_CASE_001 cd ~'
COMMAND=$(echo $i | cut -f2)
実行と保存を防ぐ方法は$COMMAND
?
答え1
注:この回答は質問の最初のバージョンに適用されます。
まず、i
タブを使って定義しましょう。
$ i=$'ls -l\tcd ~'
それでは、二重引用符なしでコマンドを実行してみましょう。
$ echo $i | cut -f2
ls -l cd ~
$ echo "$i" | cut -f2
cd ~
期待どおりに機能するには、二重引用符を追加するcut
必要があります$i
。二重引用符がない場合、シェルは次のことを行います。噴射これにより、タブが空白に置き換えられます。これにより、cut
コマンドが期待どおりに機能しなくなります。
コマンドを割り当てても、以下は変更されません。
$ Command=$(echo $i | cut -f2); declare -p Command
declare -- Command="ls -l cd ~"
$ Command=$(echo "$i" | cut -f2); declare -p Command
declare -- Command="cd ~"
一般メッセージ
ここでは、より大きなコンテキストを提供しませんが、通常、コマンドを変数に入れるのは悪い考えです。バラより「コマンドを変数に入れようとしていますが、複雑なケースは常に失敗します!」。
また、変数の場合は、COMMAND
シェル変数に小文字または大文字と小文字の混合を使用するのが最善です。システムは変数に大文字を使用するため、誤って大文字の1つを上書きしたくありません。