【问题标题】:Simple Bash Script Not Working简单的 Bash 脚本不起作用
【发布时间】: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

我知道有一些变量,例如 sleephostclientidusername,但为了让您了解我正在使用的内容,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


【解决方案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 ...)

【讨论】:

  • echo -e 曾经在这里是正确的吗?即使用户名包含文字 \t\n 序列,我认为您希望将其打印为两个字符的序列。
  • 感谢两位的帮助。我应该抓住单引号,所以这只是我对我的代码不负责任。但是我没有意识到使用 for username in $list 可能会导致上述问题,因此我需要按照建议考虑使用数组。这是一个简单的脚本,但无论脚本的目的如何,我仍然需要使用最佳实践。所以我再次感谢你们俩的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多