为什么此选项在此 Bash 脚本中不起作用?

为什么此选项在此 Bash 脚本中不起作用?

我正在扩展以下函数以包含-i | --ignore-case错误处理选项

#!/bin/sh
[ $# -ne 1 ] && echo "1 argument is needed" && exit 1
find $HOME -type f -name "*.tex" -exec grep -il "$1" {} + | vim -

扩展代码

#!/bin/sh
################################
# Check if parameters options  #
# are given on the commandline #
################################
while (( "$#" )); do
   case "$1" in
    -h | --help)
        echo "help menu"
        exit 0
        ;;
    -i | --ignore-case)
        [ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
        find $HOME -type f -name "*.tex" -exec grep -il "$1" {} + | vim -
        exit 0
        ;;
     -*)
        echo "Error: Unknown option: $1" >&2
        exit 1
        ;;
      *) # No more options
        break
        ;;
   esac

   shift # not sure if needed
done

# Do this if no cases chosen
[ $# -ne 1 ] && echo "1 argument is needed" && exit 1
find $HOME -type f -name "*.tex" -exec grep -l "$1" {} + | vim -

结果

  1. haetex "TODO"。预期输出与输出相同。通过了!
  2. haetex -i "TODO"。预期结果:使用忽略大小写搜索。结果:空白文件。

为什么该选项-i在这里不起作用?

答案1

grep将大小写更改-i为搜索$2,因为$1包含您刚刚测试的选项,而不是搜索字符串。

find $HOME -type f -name "*.tex" -exec grep -il "$2" {} + | vim -

要处理多个选项,语句最好case只设置一个变量,例如

-i | --ignore-case)
    [ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
    case_option=-i
    ;;

那么find循环后的命令将如下所示:

find $HOME -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -

在这种情况下,它可以使用,$1因为shift已将搜索字符串移至参数的开头。

所以整个脚本看起来像:

while (( "$#" )); do
   case "$1" in
    -h | --help)
        echo "help menu"
        exit 0
        ;;
    -i | --ignore-case)
        [ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
        case_option=-i
        ;;
     -*)
        echo "Error: Unknown option: $1" >&2
        exit 1
        ;;
      *) # No more options
        break
        ;;
   esac

   shift # not sure if needed
done

find $HOME -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -

相关内容