if句を使用して内部で読み取る - bash

if句を使用して内部で読み取る - bash

スクリプトがあります。

#!/bin/bash

if [[ read -t 10 -sp "Enter Password: " passwd ]]; then
    echo -e "\nPassword: ${passwd}"
else
    echo -e "\nInput timed out" >&2
    exit 1
fi

exit 0

しかし、エラーが発生します。

./script.sh: line 3: conditional binary operator expected
./script.sh: line 3: syntax error near `-t'
./script.sh: line 3: `if [[ read -t 10 -sp "Enter Password: " passwd ]]; then'

私のコードに問題がありますか?

ベストアンサー1

その必要はありません[[ ... ]]。次のように書き直すだけです。

#!/bin/bash

if read -t 10 -sp "Enter Password: " passwd; then
  echo -e "\nPassword: ${passwd}"
else
  echo -e "\nInput timed out" >&2
  exit 1
fi

exit 0

または読みやすく、短いです。

#!/bin/bash
read -t 10 -sp "Enter Password: " passwd || echo -e "\nInput timed out" >&2 && exit 1
echo -e "\nPassword: ${passwd}"
exit 0

修正する:

なしで動作する理由を理解するには、[[ ... ]]bash manを確認する必要があります。

リストであればリスト。リストなら] ... [他のリスト]

これリストされている場合処刑される。終了状態が0の場合その後、リスト 処刑される。それ以外の場合エリーフリスト順番に実行されます。 [...]

この例では、The はif list読み取りコマンドです。 [ $? -eq 0 ]また、test $? -eq 0特定の終了ステータスを持つ有効なリストです。 [[ expression ]](bash manによると)も有効なリストですが、有効な式ではread -t 10 -sp "Enter Password: " passwdありません。この人を見ると、効果的な表現が何であるかがわかります。

おすすめ記事