bash --- 解析标志和预期的(非可选)参数

bash --- 解析标志和预期的(非可选)参数
$ 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

相关内容