简单的Bash脚本不起作用

时间:2017-10-15 18:59:12

标签: 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 -EVAL的结果就像是:

not found

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

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

但它正在做的是正在检查的所有用户名的else语句。因此即使VAL包含“未找到”的内容,它仍然会回应用户名。

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

1 个答案:

答案 0 :(得分:1)

-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 ); for username in "${list[@]}"; do ...