【发布时间】:2017-10-15 18:59:12
【问题描述】:
我正在处理的 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,但为了让您了解我正在使用的内容,curl 命令的结果在VAL 行(减去 grep)会是这样的:
User "username" was not found
or
User "username" is unavailable
因此,包括到grep -E 的管道,VAL 的结果将类似于:
not found
现在根据这个StackOverflow answer,我应该能够使用通配符,以便在使用我的脚本时,如果VAL 包含“未找到”,那么它应该回显用户名可用。正如我在这里所做的那样:
[[ $VAL == *"not found"* ]]
但是,它正在做的是 else 语句,用于检查所有正在检查的用户名。因此,即使VAL 包含“未找到”,它仍然会显示用户名已被使用。
有没有人发现我的脚本有什么问题会导致这种情况发生?我已经查看了大约 100 次,没有任何错误可以帮助进行故障排除,只是它没有按预期工作。任何帮助将不胜感激。
【问题讨论】:
-
在您的 curl 命令中,您在
-H字符串周围加上单引号,这可以防止变量被扩展。使用双引号。 -
顺便说一句,
for username in $list是一种代码异味——它表明您正在尝试将列表存储在字符串中,而不是使用本机数组类型。字符串对于这项工作来说是错误的工具——它不仅限制了你可以存储的值,而且还意味着如果你的值是*,它将被当前目录中的文件列表替换.改用数组:list=( allison bob charlie ); for username in "${list[@]}"; do ... -
顺便说一句,如果您养成使用
bash -x yourscript进行调试以记录每个命令运行的习惯,它可能会帮助您缩小问题的来源(从而在未来提出更集中的问题) - - 这样,如果(例如)扩展没有在您期望的地方发生,您可以在日志中看到它并询问有关该特定行/操作的问题。
标签: linux bash shell curl glob