我遇到了一个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
我意识到有一些变量,例如sleep
,host
,clientid
和username
,但为了让您了解我正在使用的内容,在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次,我没有任何错误来帮助排除故障,只是它没有按预期工作。任何帮助将不胜感激。
答案 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 ...
)