我必须编写一个bash脚本来计算文本文件中的所有命令。脚本的参数是-p
,-n num
和文件。这意味着命令如:
script.sh -n 3 -p file.txt
script -p -n 3 file.txt
和类似的都是合法的。
但是,我必须回复任何与此类似的命令的错误:例如script.sh -n -k file.txt
。
我设法让它发挥作用,但这太冗长了。有没有办法可以在短时间内做到这一点?
答案 0 :(得分:3)
您可能需要查看以下标准命令之一:
getopts
是Bash内置的。它更新,更简单,但不支持长选项(--option
)。getopt
是一个外部程序,可能涉及更多的胶水代码。有不同的实现。 getopt
通常支持长选项。这是一个很小的getopts
示例(修改了此external site中的一个示例):
#!/bin/bash
flag=off
dir=
# iterate over each option with getopts:
while getopts fd: opt
do
case "$opt" in
f) flag=on;;
d) dir="$OPTARG";;
*) echo >&2 "usage: $0 [-f] [-d directory] [file ...]"
exit 1;;
esac
done
# remove all positional pararmeters we already
# handled from the command line:
shift $(( expr $OPTIND - 1 ))
# main part of your program, remaining arguments are now in
# $@ resp. $0, $1, ...
答案 1 :(得分:1)
我想建议另一个比你更简单易懂的片段,因为它完全描述了你在评论中指定的两个有效案例:
如果我想“调用”我的脚本,它必须如下所示:
script.sh -n +number -p file.txt
。file.txt
必须是最后一个参数,但-n
和-p
可以切换。
所以案例是($0
到$4
):
script.sh
-n
+number
-p
file.txt
script.sh
-p
-n
+number
file.txt
它仅使用if
和Bash的逻辑运算符:
#!/bin/bash
if ! { [[ "$1" = "-n" ]] && [[ "$2" =~ ^-[0-9]+$ ]] && [[ "$3" = "-p" ]] && [[ "$4" =~ ".txt"$ ]] ; } &&
! { [[ "$2" = "-n" ]] && [[ "$3" =~ ^-[0-9]+$ ]] && [[ "$1" = "-p" ]] && [[ "$4" =~ ".txt"$ ]] ; }
then
echo "Error" && exit 1
fi
注意:
{
,}
)语法在其列表末尾需要;
。*.txt
-
开头,而在您的规范中,您需要+
。