2017-10-15 168 views
0

我遇到了一个shell脚本问题,我正在处理这个问题,无论出于何种原因,这些脚本工作不正常。脚本的批量和那里的东西都走错了,下面是:简单的Bash脚本不能正常工作

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 -EVAL结果只会是这样的:

not found 

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

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

但是它在做什么是正在检查所有的用户名的else声明。因此,即使在VAL包含“未找到”的情况下,仍然会回应用户名。

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

+2

在你的curl命令中,你在'-H'字符串周围放置了单引号,这可以防止变量被扩展。使用双引号。 –

+0

顺便说一句,'对于$ list中的用户名'是一种代码异味 - 它表明你正试图将一个列表存储在一个字符串中,而不是使用本地数组类型。字符串是作业的错误工具 - 它不仅限制了可以存储的值,而且还意味着如果您有'*'的值,它将被当前目录中的文件列表替换。用数组代替:'list =(allison bob charlie);用于“$ {list [@]}”中的用户名;做...' –

+0

顺便说一句,如果你养成使用'bash -x yourscript'调试以记录每个命令运行的习惯,它可能会帮助你缩小发生问题的地方的范围(并且因此在将来会问更多重点问题) - 如果(例如)一个扩展没有发生在你期望的地方,你可以*在日志中看到它*并且询问关于该特定行/操作的问题。 –

回答

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 ...

+0

'echo -e' *永远*在这里是对的吗?即使用户名包含一个文字'\ t'或'\ n'序列,我想你会希望将它打印为双字符序列。 –

+0

感谢你们的帮助。我应该抓住单引号,这只是我对我的代码不负责任。但是我没有意识到在$ list中使用'用户名'可能会导致上述问题,所以我需要按照建议使用数组。这是一个简单的脚本,但无论脚本的目的如何,我仍然需要使用最佳实践。所以我再次感谢你们的帮助! – Eric