linux - 简单的 Bash 脚本不工作

标签 linux bash shell curl glob

我正在处理的 shell 脚本有问题,无论出于何种原因,它都没有按预期工作。下面是大部分脚本以及出错的地方:

for username in $list
do
   sleep $sleep
   VAL=`curl -H 'Client-ID: $clientid' -s $host$username | jq -r .message | grep -E "unavailable|not found"`
   if [[ $VAL == *"not found"* ]]; then
     echo "$username is available"
     echo "$username" >> available.names
   else
     echo -e "$username is reserved"
   fi
done

我意识到有一些变量,例如 sleephostclientidusername 但要给出你知道我在做什么,在 VAL 行(减去 grep)运行的 curl 命令的结果将是这样的:

User "username" was not found
or
User "username" is unavailable

因此,包括到 grep -E 的管道,VAL 的结果将类似于:

not found

现在根据这个StackOverflow answer ,我应该能够使用通配符,以便在使用我的脚本时,如果 VAL 包含“未找到”,那么它应该回显用户名可用。正如我在这里所做的那样:

[[ $VAL == *"not found"* ]]

然而,它所做的是针对所有正在检查的用户名的 else 语句。因此,即使 VAL 包含“未找到”,它仍然会回显用户名已被占用。

有没有人发现我的脚本有什么问题会导致这种情况发生?我已经查看了大约 100 次,没有发现任何错误可以帮助排除故障,只是它没有按预期工作。任何帮助将不胜感激。

最佳答案

-H 'Client-ID: $clientid' 中的单引号明显错误, 因为 $clientid 的值不是那样扩展的。 请改用双引号。

顺便说一句,你不需要[[ $VAL == *"not found"* ]], 您可以直接使用管道的 grep 的退出代码编写条件:

for username in $list
do
   sleep $sleep
   if curl -H "Client-ID: $clientid" -s "$host$username" | jq -r .message | grep -qE "unavailable|not found"; then
     echo "$username is available"
     echo "$username" >> available.names
   else
     echo "$username is reserved"
   fi
done

正如@CharlesDuffy 在评论中指出的那样,echo -e 没有任何意义,因此我也将其删除。 他还指出了编写 for username in $list 时的代码味道, 而不是使用适当的数组。 (list=( allison bob charlie ); 对于 "${list[@]}"中的用户名; do ...)

关于linux - 简单的 Bash 脚本不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46758837/

相关文章:

Python IPC 一对多

linux - Bash 循环不工作 — 找不到命令 "[0%"

python - 从 Bash 或 Python 检查邮件主题

bash - bash echo 命令可以返回非零退出代码吗?

bash - 从 bash 中的行中提取两个子字符串,然后将它们连接起来

php - 如何使用 shell 和终端克隆 mysql 数据库而不进行 mysql 转储和上传

c++ - GCC 4.6.2 内联行为

linux - 跟踪 shebang 脚本

Bash If 语句检查字符串是否等于多个字符串文字之一

mysql - 命令被 bash 错误解释