如何在 bash 中结合 getopts 和位置参数? [复制]

2024-03-10

我想同时使用getopts和位置参数,但是如果我将位置参数传递给程序getopts迷路。

directory=$1

while getopts l: flag; do
  case "$flag" in
    l) level=$OPTARG;;
  esac
done

if [ -n "$level" ]; then
  echo "Level exist!"
else
  echo "Level doesn't exist!"
fi

所以当我像这样运行程序时:

sh myprogram.sh ~/documents -l 2

我预计:

Level exist!

相反,它返回:

Level doesn't exist!

问题是,如果我在没有位置参数(~/documents)的情况下运行程序,如下所示:

sh myprogram.sh -l 2

我得到正确的输出:

Level exist!

这是为什么?我如何同时使用位置参数和getopts在bash中?

Thanks!


大多数工具都是以以下形式编写的:tool [options] arg ...

所以你会这样做:

# first, parse the options:
while getopts l: flag; do
  case "$flag" in
    l) level=$OPTARG;;
    \?) exit 42;;
  esac
done

# and shift them away
shift $((OPTIND - 1))

# validation
if [ -n "$level" ]; then
  echo "Level exist!"
else
  echo "Level doesn't exist!"
fi

# THEN, access the positional params
echo "there are $# positional params remaining"
for ((i=1; i<=$#; i++)); do
  printf "%d\t%s\n" $i "${!i}"
done

Use the \?如果用户提供未知选项或未能提供所需参数,则中止脚本

并像这样调用它:

$ bash test.sh
Level doesn't exist!
there are 0 positional params remaining

$ bash test.sh -l 2
Level exist!
there are 0 positional params remaining

$ bash test.sh -l 2 foo bar
Level exist!
there are 2 positional params remaining
1   foo
2   bar

$ bash test.sh -x
test.sh: illegal option -- x

$ bash test.sh -l
test.sh: option requires an argument -- l

But you cannot将选项放在参数后面:找到第一个非选项参数时 getopts 停止

$ bash test.sh foo bar -l 2
Level doesn't exist!
there are 4 positional params remaining
1   foo
2   bar
3   -l
4   2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 bash 中结合 getopts 和位置参数? [复制] 的相关文章

  • 如何让 STDOUT 和 STDERR 都转到终端和日志文件?

    我有一个脚本 将由非技术用户交互式运行 该脚本将状态更新写入 STDOUT 以便用户可以确定脚本运行正常 我希望将Stdout和STDERR重定向到终端 以便用户可以看到脚本正在工作 并查看是否存在问题 我还希望将两个流都重定向到日志文件
  • 如何使用 echo 写入非 ASCII 字符?

    如何写非ASCII http en wikipedia org wiki ASCII使用 echo 的字符 是否有转义序列 例如 012或类似的东西 我想使用以下方法将 ASCII 字符附加到文件中 echo gt gt file 如果您关
  • 通过 bash 从文件中检索电子邮件主题

    我有一个 shell 脚本 它将文件从服务器邮件文件夹下载到 NAS 设备 以便客户端拥有本地备份的副本 文件保存为11469448248 H15587P19346 smtp x14 eu 2 S文件 我已将扩展名更改为标准 eml 格式
  • sed/awk/bash 用外部文件内容替换两个字符串之间的文本

    我正在编写一个脚本 命令 它将采用 inputFile1 在其中查找特定的开始和结束字符串 并替换它们之间的所有文本 包含 inputFile2 的完整内容 理想情况下 但不是强制性的 这应该不需要转义特殊字符即可工作 因此我可以将字符串放
  • 如果未设置,则从控制台读取 Makefile 变量

    我正在更新一个从外部源访问某些资源的 Makefile 即存在以下形式的规则 External cvs up 对于不受限制的资源 它可以按预期工作 现在 出现了功能漂移 外部资源需要更复杂的登录 因此规则已更改为与此没有太大不同的内容 Ex
  • 用于编辑 /etc/sudoers 文件的正则表达式模式

    我想删除 etc sudoers 文件中的 uncommnet 轮组 那么我应该使用什么正则表达式模式 cat etc sudoers Allows members of the sys group to run networking so
  • 配置confixtx.yaml文件?

    我正在尝试使用以下内容构建 Hyperledger Fabric 网络 Smartforce 订购者组织 Falcon io ORG1 弗罗斯特 io ORG2 我已经使用 cryptogen 工具生成了所有加密材料 不希望使用 confi
  • 使用 awk 解析日志文件

    我尝试使用以下代码解析日志文件 if line match then awk 2 vFiler echo vFiler 解释 有一些行以这样的模式开头 或 vol 后跟名称 我想找到所有以 或 vol 并将后面的字符串设置为等于变量 但我真
  • shell中如何求数组的长度?

    shell中如何求数组的长度 例如 arr 1 2 3 4 5 我想得到它的长度 在本例中是 5 a 1 2 3 4 echo a 4
  • 带有存储在文件中的通配符的 grep

    我希望 grep 通过读取需要从文本文件中过滤掉的内容来过滤掉行 这是我给 grep 的内容 它存储在foo txt Users 1337 X Users 1337 R Users 1337 W 这是它应该过滤的内容 它存储在bar txt
  • 在 BASH 脚本中使用字符串作为变量名

    我有以下内容 bin sh n fred bob f n echo f 我需要在替换后执行底线 echo n 有办法做到这一点吗 我刚刚得到 test sh line 8 f bad substitution 在我这边 您可以像这样使用数组
  • 如何将查找结果传递给 CP,以便带空格的文件名起作用 [重复]

    这个问题在这里已经有答案了 我正在尝试将带有特定附件的文件复制到不同的目录 并保留其相对路径 从我调用的原始顶部路径 cp parents find name pdf print new path 我相信这有效 但仅当找到的文件名称中没有空
  • 如何在 Makefile 中定义全局 shell 函数?

    我想定义一个shell函数 bin sh test do some complicated tests 1 2 if something then build thisway 1 2 else build otherway 1 2 fi 这
  • 如何在 Linux 中重新添加 unicode 字节顺序标记?

    我有一个相当大的 SQL 文件 它以 FFFE 的字节顺序标记开头 我使用 unicode 感知的 linux 分割工具将此文件分割成 100 000 行块 但是当将这些传递回窗口时 它确实not与第一个部分以外的任何部分一样 只是它具有
  • 为什么 shell=True 的 subprocess.Popen() 在 Linux 和 Windows 上的工作方式不同?

    使用时subprocess Popen args shell True 跑步 gcc version 仅作为示例 在 Windows 上我们得到 gt gt gt from subprocess import Popen gt gt gt
  • 使用运算符 j 操作 zsh 数组

    以下代码摘自here http eseth org 2010 git in zsh html function vi git st local ahead behind remote local a gitstatus Are we on
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • Grep 递归和计数

    需要在具有大量子目录的目录中搜索文件内的字符串 我在用着 grep c r string here 我怎样才能找到总数量 如何仅输出至少具有一个实例的文件 使用 Bash 的进程替换 这给出了我认为是您想要的输出 如果不是 请澄清问题 gr
  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • #*/ 在 UNIX Shell 脚本中使用

    谁能详细说明 在 UNIX Shell 脚本中的工作原理 我已经看到它在 Korn Shell 中的使用 它专门用于删除文件的扩展名 例如 func write app log o 删除状态文件 CIE STATUS FILE 这里假设文件

随机推荐