Bash脚本 - 如何在使用getopts

时间:2015-12-14 20:10:25

标签: bash shell getopts

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

1 个答案:

答案 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