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
我想在这个脚本中做两件事: 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