我已经知道 getopts,这很好,但令人讨厌的是,即使是强制参数,你也必须有一个标志。
理想情况下,我希望能够有一个脚本以这种形式接收参数:
script.sh [optional arguments] [anything required]
例如
script.sh -rvx output_file.txt
脚本说你必须有一个输出文件。有什么简单的方法可以做到这一点吗?
据我所知,对于 getopts,它必须看起来像:script.sh -rvx -f output_file.txt
,这不是很干净。
必要时我也可以使用 python,但只有 2.4 可用,有点过时了。
最佳答案
不要使用内置的 getopts,而是使用 getopt(1)。它们(微妙地)不同并且擅长做不同的事情。对于您的场景,您可以这样做:
#!/bin/bash
eval set -- $(getopt -n $0 -o "-rvxl:" -- "$@")
declare r v x l
declare -a files
while [ $# -gt 0 ] ; do
case "$1" in
-r) r=1 ; shift ;;
-v) v=1 ; shift ;;
-x) x=1 ; shift ;;
-l) shift ; l="$1" ; shift ;;
--) shift ;;
-*) echo "bad option '$1'" ; exit 1 ;;
*) files=("${files[@]}" "$1") ; shift ;;
esac
done
if [ ${#files} -eq 0 ] ; then
echo output file required
exit 1
fi
[ ! -z "$r" ] && echo "r on"
[ ! -z "$v" ] && echo "v on"
[ ! -z "$x" ] && echo "x on"
[ ! -z "$l" ] && echo "l == $l"
echo "output file(s): ${files[@]}"
编辑:为了完整起见,我提供了一个处理需要参数的选项的示例。
关于bash - 如何创建带参数的 bash 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587076/