shell 脚本参数非位置

2023-12-30

有没有办法将非位置参数提供给 shell 脚本? 意思是明确指定某种标志?

. myscript.sh value1 value2
. myscript.sh -val1=value1 -val2=value2

您可以使用getopts,但我不喜欢它,因为它使用起来很复杂,而且不支持长选项名称(无论如何不是 POSIX 版本)。

我建议不要使用环境变量。名称冲突的风险太大了。例如,如果您的脚本根据值的不同做出不同的反应ARCH环境变量,并且它执行另一个脚本(您不知道)也对ARCH环境变量,那么您可能会遇到一个很难发现的错误,并且偶尔会出现。

这是我使用的模式:

#!/bin/sh

usage() {
    cat <<EOF
Usage: $0 [options] [--] [file...]

Arguments:

  -h, --help
    Display this usage message and exit.

  -f <val>, --foo <val>, --foo=<val>
    Documentation goes here.

  -b <val>, --bar <val>, --bar=<val>
    Documentation goes here.

  --
    Treat the remaining arguments as file names.  Useful if the first
    file name might begin with '-'.

  file...
    Optional list of file names.  If the first file name in the list
    begins with '-', it will be treated as an option unless it comes
    after the '--' option.
EOF
}

# handy logging and error handling functions
log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$*"; exit 1; }
usage_fatal() { error "$*"; usage >&2; exit 1; }

# parse options
foo="foo default value goes here"
bar="bar default value goes here"
while [ "$#" -gt 0 ]; do
    arg=$1
    case $1 in
        # convert "--opt=the value" to --opt "the value".
        # the quotes around the equals sign is to work around a
        # bug in emacs' syntax parsing
        --*'='*) shift; set -- "${arg%%=*}" "${arg#*=}" "$@"; continue;;
        -f|--foo) shift; foo=$1;;
        -b|--bar) shift; bar=$1;;
        -h|--help) usage; exit 0;;
        --) shift; break;;
        -*) usage_fatal "unknown option: '$1'";;
        *) break;; # reached the list of file names
    esac
    shift || usage_fatal "option '${arg}' requires a value"
done
# arguments are now the file names
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell 脚本参数非位置 的相关文章

  • linux下如何获取昨天和前天?

    我想在变量中获取 sysdate 1 和 sysdate 2 并回显它 我正在使用下面的查询 它将今天的日期作为输出 bin bash tm date Y d m echo tm 如何获取昨天和前天的日期 这是另一种方法 对于昨天来说 da
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • 在powershell中检查文件是否可读且正常

    我是 powershell 新手 我想检查文件是否可读且正常 在 unix 中 我们可以使用 f 和 r 在一行中完成此操作 例如 以下 shell 脚本函数接受文件名作为参数并检查文件的可读性和规律性 与此等效的 powershell 是
  • 为什么减法返回 - 符号

    我对简单的减法有疑问 但我不明白出了什么问题 我的代码 start date s N cut b1 13 Treatment end date s N cut b1 13 delta expr end start echo delta de
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • 将“npm run start”的输出写入文件

    我想捕获的输出npm run start在一个文件中 我遇到了大量错误 我想更好地控制如何筛选输出 当我尝试时 npm run start gt log txt 我得到一个非常简短的文件 8 行 其结尾为 34m 39m 90m wdm 3
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 有一种简单的方法可以忽略时间戳来区分日志文件吗?

    我需要比较两个日志文件 但忽略每行的时间戳部分 确切地说是前 12 个字符 有没有一个好的工具 或者一个聪明的 awk 命令 可以帮助我 根据您使用的 shell 您可以改变方法 Blair https stackoverflow com
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 如何在递归调用函数时阻止 bash 创建子 shell

    这是一个计算阶乘的简单 shell 函数 bin bash function factorial if 1 lt 2 then echo 1 else echo 1 factorial 1 1 fi factorial 1 但我发现这个脚本
  • Mongodb shell mongo:通常只允许每个套接字地址(协议/网络地址/端口)使用一次。对于套接字:0.0.0.0:27017

    前两天还好好的 现在mongod不起作用 甚至echo ps A grep mongo没有打印任何内容 但它警告错误 每个套接字地址只有一种用途 怎么杀掉它 我也尝试过不同的随机端口 他们怎么可能也失败呢 D mongodb win32 x
  • 使用 posix shell 测试字符串中的正则表达式

    如何测试字符串是否与特定字符串匹配正则表达式与基本 无 bash 或任何其他 posix shell 脚本 在 if 语句中 您可以使用expr在 POSIX shell 中计算正则表达式的命令 s Abc expr s alpha 3 e
  • 如何在 shell 脚本中操作 $PATH 元素?

    有没有一种惯用的方法从类似 PATH 的 shell 变量中删除元素 这就是我想要的 PATH home joe bin usr local bin usr bin bin path to app bin and remove or rep
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • if [ -z "${FILE_LIST}" ] 中的 -z 是什么

    遇到了这个 什么是 z在 shell 脚本中if z FILE LIST 是相同的test And man test gives z STRING the length of STRING is zero 注意 在某些平台上 是一个符号链接
  • OSX bash 最小化窗口

    在 Mac 中并使用 bash shell 我想执行一个包含单个命令 启动 Jupyter Lab 的文件并立即最小化终端窗口 有没有办法在不安装第三方软件的情况下做到这一点 是的 只需使用osascript https ss64 com
  • sed 错误“未终止的 's' 命令”故障排除

    我正在构建一个script https stackoverflow com questions 4036832 replacing a specific term in an xml file其中 它将用文件夹路径替换 XML 文件中的模式
  • 使用正则表达式模式查找 -name 并使用 cp 替换文件名

    目前我正在使用该命令cron复制 data从源到目标路径 find source path name data exec cp target path 源码结构为 source path category1 001 data source
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我

随机推荐

  • 在Windows10上为GitKraken配置合并工具

    我下载了 GitKraken 来处理 Git 存储库 它非常适合我需要的一切 但我无法将其配置为使用 WinMerge 或 Meld 等合并工具 当程序发现冲突时 它会显示一个按钮 上面写着 在合并工具中打开 由于我尚未配置合并工具 因此我
  • 在 JavaScript 函数中传递字符串参数

    我试图将字符串传递给 JavaScript 函数 正如这里提到的 在 onclick 函数中传递字符串参数 https stackoverflow com questions 9643311 pass a string parameter
  • Windows批处理命令for循环设置环境变量

    我正在尝试找到一种方法来动态构建环境变量 其中包含应用程序的 WEB INF lib 文件夹下的 JAR 文件列表 这是我到目前为止所拥有的 但它每次都会覆盖自己 因此当到达循环末尾时 您只有变量中设置的循环中的最后一个文件 SETLOCA
  • Twitter API + OAuth:无法发送状态更新,收到 401

    我正在尝试使用 Twitter 的 API 和 OAuth 发送状态更新 新推文 我正在使用 Shannon Whitley NET 代码示例http www voiceoftech com swhitley p 681 http www
  • 创建 JavaScript 命名空间的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我还没有在互联网上找到在 JavaScript 中创建命名空间的通用方法 创建命名空间的最佳方法是什么 请列出特定方法可能存在的任何缺陷 fun
  • 手动实例化@InjectMock注解字段

    我浏览了一些博客 以了解 Mockito 注释工作原理的基础知识 然而 我面临着一个疑问 什么时候需要手动实例化带有注释的字段 InjectMocks i e InjectMocks A a new A 又何时依赖MockitoAnnota
  • jQuery ajax() POST 到 Slim PHP 框架

    使用 jquery mobile phonegap 尝试 POST 到 Slim 应用程序 我有以下代码 document on vclick test form function ajax type POST url http mydom
  • 在MySQL上模拟多维数组

    我有两个具有以下结构的表 文章 文章 ID 文本 标签 tag id article id 文本 如何通过一个查询选择所有文章和所有关联标签 据我所知 MySQL只能返回一个二维数组 所以我可以一个解决方案是将所有标签连接到文章选择结果的一
  • QML 使用计时器移动文本

    我需要在屏幕上从右到左连续创建移动文本 我已经使用它实现了QML Timer and Text元素 下面的代码工作正常 但我担心下面的代码会导致更多的 cpu 或内存使用 主要是因为计时器每 33 毫秒触发一次 我必须在应用程序中的位置和多
  • 使用 awk 遍历文件列表?

    我很陌生awk 但我正在寻找一种方法来迭代目录中的所有文件并执行一个简单的awk命令 我的命令是一个简单的替换 将所有制表符替换为两个空格 awk gsub t print 如何扩展以循环遍历目录并对所有文件执行命令 将文件传递至awk当然
  • spring JSP MVC 和 Thymeleaf MVC 的区别

    Spring JSP MVC 和 Thymeleaf MVC 有什么区别 哪一种是春季网页设计的最佳方式 它们都是 Spring MVC 的视图层 首先 最基本的区别是文件扩展名 jsp html 评论中的布拉尼斯拉夫是对的 JSP不是模板
  • 当匹配查询的所有文档的字段总和超过某个值时,如何触发 elastalert

    当匹配查询的所有文档的字段总和超过某个值时 是否可以触发elastalert 假设每个文档都有一个 价格 值 例如 当最后一天的 价格 值总和超过 200 时 是否可以触发 elastalert 示例文档 type transaction
  • 转换数据以适应正态分布

    我有一个比较容易理解的问题 我有一组数据 我想估计这些数据适合的程度标准正态分布 为此 我从我的代码开始 f p m p hist data 128 f p f p trapz m p f p x th min data 001 max d
  • 在 UIView 外部绘制阴影

    背景 我有一个UIView具有以下属性 阿尔法 1 背景颜色 白色 不透明度 0 35 圆角 阴影 Code 这就是我创建阴影的方法 UIView扩大 self layer masksToBounds false self layer sh
  • 对于iOS healthkit如何保存收缩压和舒张压值?

    这是在健康套件中保存血压数据的代码 HKUnit BPunit HKUnit millimeterOfMercuryUnit HKQuantity BPSysQuantity HKQuantity quantityWithUnit BPun
  • 在 PHP 中向日期添加三个月

    我有一个变量叫做 effectiveDate包含日期2012 03 26 我试图在此日期基础上增加三个月 但没有成功 这是我尝试过的 effectiveDate strtotime 3 months strtotime effectiveD
  • 按上下文获取所有标签以实现 acts-as-taggable-on

    We use https github com mbleigh acts as taggable on https github com mbleigh acts as taggable on对于我们的 Rails 应用程序 我们遇到了问题
  • 如何与 React Test Renderer / Jest 渲染的组件交互

    我正在使用 Jest 和快照测试 我想做的是渲染一个组件ReactTestRenderer 然后模拟单击其中的按钮 然后验证快照 ReactTestRenderer 返回的对象create呼叫有一个getInstance函数允许我直接调用它
  • 不兼容的片段类型

    你好 我在 android 中有一个小应用程序 我在其中使用带导航抽屉的片段作为菜单 但现在我想在用户单击某些内容时在片段对话框弹出窗口中显示 并且出现以下错误 主要活动 private void displayView int posit
  • shell 脚本参数非位置

    有没有办法将非位置参数提供给 shell 脚本 意思是明确指定某种标志 myscript sh value1 value2 myscript sh val1 value1 val2 value2 您可以使用getopts 但我不喜欢它 因为