シェルスクリプトから出力を取得するには、ifとforを使用しないでください。

シェルスクリプトから出力を取得するには、ifとforを使用しないでください。

何も印刷されませんが、なぜそれが理解できないのですか?

read -e -i "no" -p "Install? " result

if [ '$result' == 'yes' ]; then
  declare -a subs=('one' 'two')
  for sub in "${subs[@]}"
  do
    echo "$sub"
  done
fi

答え1

$result一重引用符の代わりに二重引用符を使用する必要があります。それ以外の場合は拡張されません。

[ '$result' == 'yes' ]$resultliteralをliteralと比較しようとするため、決してtrueと評価されませんyes

また、Kusaranandaが指摘したように、演算子はbash==テスト設定に使用され、演算子は標準(POSIX)テスト設定に使用されます。 [[=[

したがって、その行を次のように変更する必要があります。[ "$result" = 'yes' ]


知っておくべきもう一つの良いツールは、スクリプトを追跡するために使用できる組み込みコマンドsetとそのスイッチです。これを元のスクリプトの先頭に-x追加して実行すると、次のものが印刷されることがわかります。set -x

+ read -e -i no -p 'Install? ' result
Install? yes
+ '[' '$result' == yes ']'

ご覧のとおり、「$result」を「yes」と比較しようとしています。正しく引用すると、変数は表示されず、$result次のように拡張が表示されます。

+ read -e -i no -p 'Install? ' result
Install? yes
+ '[' yes == yes ']'
+ subs=('one' 'two')
+ declare -a subs
+ for sub in '"${subs[@]}"'
+ echo one
one
+ for sub in '"${subs[@]}"'
+ echo two
two

スクリプトを使用して壁に頭を当てるたびに、スクリプトを開き、スクリプトが何をしているのか、間違ったset -x場所を追跡する必要があります。

答え2

@Jesse_bの答えに従います。

変数に二重引用符が必要なのはなぜですか?

一重引用符と二重引用符の違いは次のとおりです。

文字を一重引用符で囲むと、引用符内の各文字のリテラル値が保持されます。前にバックスラッシュがある場合でも、一重引用符の間に一重引用符を使用することはできません。

文字を二重引用符で囲むと、履歴拡張が有効になっている場合は、$、`、\、!を除く引用符内のすべての文字のリテラル値が保持されます。

~からman bash

これを覚えておく必要があります。これにより、しばらくの間デバッグの手間を省くことができます。

関連情報