代码之家  ›  专栏  ›  技术社区  ›  Eric

简单Bash脚本不工作

  •  0
  • Eric  · 技术社区  · 7 年前

    我对一个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 增值税 简单来说就是:

    not found
    

    现在根据这个 StackOverflow answer ,我应该能够使用通配符,以便在使用我的脚本时,如果

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

    然而,它所做的是 else 增值税 包含“not found”,仍然回响用户名已被占用。

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   janos slartidan    7 年前

    中的单引号 -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 ... )

    推荐文章