使用 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:

如果列出;然后列出; [ 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

相关内容