尝试使用bash脚本在命令行参数中找到确切的单词

时间:2016-11-21 00:29:02

标签: bash

我接受用户输入并希望脚本适用于以下情况。我尝试过使用'=='和'=〜'。但是,当我使用'=='但第一种情况失败时,我的脚本适用于第二种情况。当我使用'=〜'而不是脚本接受像./script john harryyy smith这样的参数时,我不希望它接受。让这两种情况都有效的最佳方法是什么?

  1. ./script john harry smith
  2. ./script john
  3. if [[ "${args[@]}" == "john" ]]; then
    ....
    else
    ....
    

2 个答案:

答案 0 :(得分:1)

您可以使用grep,然后使用wc来计算grep匹配。

if [[ "$(echo ${args[@]} | grep "john" | wc -l) -ge 0 ]]; then ...; else...; fi

对于用户输入,我建议使用grep -i,以使grep搜索大小写不敏感。

修改

没有完全阅读整个问题,所以我的不好。上面的内容仍然会与哈里相提并论。为了将多个参数匹配到多个变量,我可能会使用for循环。

for ((i=0;i<${#args[@]};i++)); do
    if [ ${args[$i]} = "john" ]; then
        ...
        break #optional, prevents the code from executing twice if the user has typed two "john"s.
    fi
done

但是,您必须为要检查的每个名称设置一个循环。如果你把名字也放在一个数组中,你可以改为双循环;

#array names contains the names to check against.
for ((i=0;i<${#names[@]};i++)); do
    for ((ii=0;ii<${#args[@]};ii++)); do
        if [ ${args[$ii]} = ${names[$i]} ]; then
            ...
            continue 2 #again, optional, continues the first loop for the same reason as above
        fi
    done
done

答案 1 :(得分:0)

我想我会使用像这样的case语句..这不是确切的代码。这看起来很有效,因为我特别喜欢像#john&#39;

这样的字符串

案例$ {args [i]} in         &#39;哈利&#39; |&#39;史密斯&#39; | .....)          .....          ......          ;;

    'john')
     .....
     .......
      ;;

    *)