スクリプトがあります。
#!/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
ありません。この人を見ると、効果的な表現が何であるかがわかります。
答え2
ステートメントでコマンドを使用していますが[[ ]]
、これは言葉ではありません。この演算子は、test
特定の条件を検証する関数のように使用する必要があります。
read
コマンドを個別に実行し、終了コードを確認することをお勧めします。
#!/bin/bash
read -t 10 -sp "Enter Password: " passwd
if [ $? -eq 0 ]; then
echo -e "\nPassword: ${passwd}"
else
echo -e "\nInput timed out" >&2
exit 1
fi
exit 0