我有一个脚本:
#!/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:
如果列出;然后列出; [ elif 列表;然后列出; ] ... [ 其他列表; ] 菲
这如果列出被执行。如果其退出状态为零,则然后列出 被执行。否则,每个elif列表依次执行,[...]
在本例中,Theif 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