我想在这个脚本中做两件事:1) 将文件名传递给脚本2) 将选项传递给脚本
示例1:$./test_script.sh file_name_to_be_read
只将文件名传递给脚本
示例2:$./test_script.sh -a -b file_name_to_be_read
将文件名和选项传递给脚本
我能够使用以下代码使示例1工作:
while read -r line ; do
echo $line
done
在示例2中,我想添加如下附加标志:
while getopts "abc opt; do
case "$opt" in
a) a=1
echo "a is enabled"
;;
b) b=1
echo "b is enabled"
;;
esac
done
但是,我如何使file_name成为强制性的,并在有或没有选项的情况下使用?
getopts
仅解析选项(以-
开头的参数);其他论点就不提了。参数OPTIND
告诉您尚未查看的第一个参数的索引;通常在此之前放弃选项。
while getopts "ab" opt; do
case "$opt" in
a) a=1
echo "a is enabled"
;;
b) b=1
echo "b is enabled"
;;
esac
done
shift $((OPTIND - 1))
echo "$# arguments remaining"
for arg in "$@"; do
echo "$arg"
done
前面的,如果称为bash tmp.bash -a -b c d e
,则产生
$ bash tmp.bash -a -b c d e
a is enabled
b is enabled
3 arguments remaining:
c
d
e