何も印刷されませんが、なぜそれが理解できないのですか?
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' ]
$result
literalを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
これを覚えておく必要があります。これにより、しばらくの間デバッグの手間を省くことができます。