我正在扩展以下函数以包含-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 -
结果
haetex "TODO"
。预期输出与输出相同。通过了!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 -