我想在这个脚本中做两件事: 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成为必需的,并且可以使用或不使用选项?
答案 0 :(得分:4)
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