Bash 脚本 - 如何在使用 getopts 时逐行读取文件

Bash script - how to read file line by line while using 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 成为强制性的,并在有或没有选项的情况下使用?

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