$ bash file.sh expected_arg -f optional_arg
我看过一些帖子,其中提到使用$1
来获取第一个参数
以及使用 getopts 解析标志参数的帖子。我还没有看到一篇帖子能够解决这两个问题。
我目前正在expected_arg
通过访问$1
。
我-f
根本无法处理该标志。即使我的测试脚本中也有这个:
#!/bin/bash
dirname=$1
[[ -z $dirname ]] && echo "Project name required as an argument." && return
# get flags
verbose='false'
aflag='false'
bflag='false'
files='false'
while getopts 'abf:v' flag; do
case "${flag}" in
a) aflag='true' ;;
b) bflag='true' ;;
f) files="${OPTARG}" ;;
v) verbose='true' ;;
*) error "Unexpected option ${flag}" ;;
esac
done
echo "$files"
echo "$HOME/Desktop/$dirname"
exit
终端显示:
Jills-MBP:~ jillr$ bash test.sh blah -f file
false
/Users/jillr/Desktop/blah
除非我切换参数的顺序,如下所示:
bash file.sh -f optional_arg expected_arg
终端输出:
Jills-MBP:~ jillr$ bash test.sh -f file blah
file
/Users/jillr/Desktop/-f
所以很自然地, -f 被处理为$1
,这不是我想要的。我需要获取预期参数
需要的约束:
- 我需要允许不同数量的标志(从没有到几个)。因此,expected_arg的位置会有所不同
- Expected_arg 是必须的
- 我宁愿避免使用另一个标志来解析预期参数(例如,我想避免做类似的事情
$ bash test.sh -f file -d blah
)
我怎样才能满足这些限制?
答案1
没关系。我找到了这个帖子:使用 getopts 解析非选项参数后的选项
shift
这基本上是说我只需在 dirname=$1 之后放置即可解决我的问题
这将允许输入参数
$ bash file.sh expected_arg -f optional_arg