解析可选参数和非可选参数

2024-01-10

我是 bash 的新手,在阅读并尝试了很多有关如何解析参数的内容后,我无法做我真正想做的事情,我想解析可选参数和非可选参数。更具体地说,我想解析 3 个参数,第一个(fastaq 文件)第二个(第二个可选 fastaq 文件)第三个参数将是一个目录。

my_script.sh -f1 file1.fasta --f2 file2.fasta -d/home/folder1/folder2 or

my_script.sh -f1 file1.fasta -d /home/folder1/folder2

我尝试了多种方法来做到这一点,但我不知道如何让程序识别何时有两个 fasta 文件和一个目录,以及何时只有一个 fasta 文件和一个目录。

通过这个参数,我想将它们保存在变量中,因为它们稍后将被第三方使用。

我已经尝试过这个:



for i in "$@"; do
 case $i in
   -f1=|-fasta1=)
     FASTA1="${i#=}"
     shift # past argument=value
     ;;
   -d) DIRECTORY=$2
  shift 2
     ;;
   -d=|-directory=) DIRECTORY="${i#=}"
   shift # past argument=value
     ;;
   --f2=|-fasta2=) FASTA2="${i#*=}"
    shift # past argument=value
     ;;
   *)
     ;;
 esac
done

但我刚刚得到这个

scripts_my_first_NGS]$ ./run.sh -f1 fasta.fasta -d /home/folder1
FASTA1  =
DIRECTORY     =
FASTA2     =

切勿自行解析命令行选项!

相反,可以使用 Bash 函数getopts https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-getopts,如果你不需要GNU风格的长选项或者使用GNU程序getopt https://man7.org/linux/man-pages/man1/getopt.1.html否则。

以下示例使用数组FASTA. FASTA1 is ${FASTA[0]} and FASTA2 is ${FASTA[1]}。的情况下getopts这使得只使用一个选项字符成为可能(-f) 多次。

Using getopts只有一个字符的选项:

#! /bin/bash

FASTA=()
DIRECTORY=

while getopts 'f:d:' option; do
  case "$option" in
    f)
      FASTA+=("$OPTARG")
      ;;
    d)
      DIRECTORY="$OPTARG"
      ;;
    *)
      printf 'ERROR: Invalid argument\n' >&2
      exit 1
      ;;
  esac
done
shift $((OPTIND-1))

if [[ -z ${FASTA[0]} ]]; then
  printf 'ERROR: FASTA1 missing\n' >&2
  exit 1
fi

if [[ -z $DIRECTORY ]]; then
  printf 'ERROR: DIRECTORY missing\n' >&2
  exit 1
fi

printf 'FASTA1 = %s\n' "${FASTA[0]}"
printf 'FASTA2 = %s\n' "${FASTA[1]}"
printf 'DIRECTORY = %s\n' "$DIRECTORY"

Usage:

run -f file1.fasta -f file2.fasta -d /home/folder1/folder2

Using getopt混合使用单字符和 GNU 风格的长选项:

#! /bin/bash

FASTA=()
DIRECTORY=

options=$(getopt -o d: -l f1: -l f2: -- "$@") || {
  printf 'ERROR: Invalid argument\n' >&2
  exit 1
}
eval set -- "$options"

while true; do
  case "$1" in
    --f1)
      FASTA[0]="$2"
      shift 2;;
    --f2)
      FASTA[1]="$2"
      shift 2;;
    -d)
      DIRECTORY="$2"
      shift 2;;
    --)
      shift
      break;;
    *)
      break;;
  esac
done

if [[ -z ${FASTA[0]} ]]; then
  printf 'ERROR: FASTA1 missing\n' >&2
  exit 1
fi

if [[ -z $DIRECTORY ]]; then
  printf 'ERROR: DIRECTORY missing\n' >&2
  exit 1
fi

printf 'FASTA1 = %s\n' "${FASTA[0]}"
printf 'FASTA2 = %s\n' "${FASTA[1]}"
printf 'DIRECTORY = %s\n' "$DIRECTORY"

Usage:

run --f1 file1.fasta --f2 file2.fasta -d /home/folder1/folder2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析可选参数和非可选参数 的相关文章

  • 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
  • Java 8:如何创建毫秒、微秒或纳秒的 DateTimeFormatter?

    我需要创建格式化程序来解析具有可选的毫秒 微米或纳秒分数的时间戳 例如 对于我的需求 我看到以下机会 DateTimeFormatter formatter new DateTimeFormatterBuilder append DateT
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 独特的 Linux 文件名,可按时间排序

    以前我用的是uuidgen http man7 org linux man pages man1 uuidgen 1 html创建唯一的文件名 然后我需要通过 bash 脚本按日期 时间迭代该文件名 从那时起 我发现简单地通过 ls l 循
  • 如何从 CSS 选择器中提取类名?

    故事 我目前正在构建一个 ESLint 规则 以警告在 CSS 选择器定位器中使用引导布局导向和角度技术类 目前我在字符串方法中使用简单的子字符串 for var i 0 i lt prohibitedClasses length i if
  • Objective-C 头解析

    我需要解析一些 Objective C 标头 我尝试过使用Doxygen并解析 XML 输出 但它不完全支持没有注释的 Objective C 标头 它会阻塞属性中定义的宏 请检查Doxygen 无法正确识别属性 https stackov
  • 命令中的 Bash 变量扩展[重复]

    这个问题在这里已经有答案了 DATE 1 week ago date date DATE 不起作用 我怎样才能让它发挥作用 我可以做 DATE CMD date date DATE eval DATE CMD 但我不想将整个命令存储在变量中
  • 使用 sed 将反斜杠替换为斜杠[重复]

    这个问题在这里已经有答案了 我需要更换 with 我有一个文件 其中包含 test test2 test3 test4 I tried VRS Ruta cat ruta lst sed s g sed s g output test te
  • 通过 Node.js 运行 bash 脚本 - 非法选项 -o pipelinefail

    我正在尝试使用 Node js 执行 bash 脚本child process exec 然而它在文件的第二行爆炸 usr bin env bash set eo pipefail TRACE set x echo we are here
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • 如何运行 bash 压缩脚本?

    有没有一种方法可以直接运行带有 参数 的压缩bash脚本 而无需将其解压缩到文件中 然后运行解压缩的文件 例如 我需要使用一些给定的参数执行 setup mysql gzip 压缩脚本 n wordpress locahost 而不先解压缩
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • rsync --include 选项不排除其他文件

    尝试rsync某些扩展名 sh 的文件 但下面的bash脚本仍然传输所有文件 为什么 from home xxx rsync zvr include sh from root host home tmp 您需要添加 exclude all
  • 如何使用 bash 脚本通过 tar 备份文件系统?

    我想备份我的 ubuntu 文件系统 我写了这个小脚本 这是非常基本的 但这是我第一次尝试 我害怕犯错误 由于需要几个小时才能完成才能看到结果 因此我认为最好向经验丰富的程序员询问我是否做错了什么 我特别感兴趣 gt 会记录输出mv或者它也
  • BASH 中带有千位分隔符的数字格式

    我有一个号码12343423455 23353 我想用千位分隔符格式化数字 所以输出将是12 343 423 455 23353 printf 3f n 12345678 901 12 345 678 901
  • shell脚本中是否有互斥/信号量机制?

    我正在 shell 脚本中寻找互斥 信号量 并发机制 考虑以下情况 除非 a 用户不关闭共享文件 否则 b 用户应该无法打开 更新它 我只是想知道如何在 shell 脚本中实现互斥量 信号量 临界区等 在 shell 脚本中实现锁定机制 文
  • 如何在bash中进行二进制加法

    我正在尝试将两个 32 位二进制数相加 其中之一是常数 address range in binary 另一个是数组的元素 IPinEachSubnet val 我正在尝试按照说明进行操作here https www linuxquesti
  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如
  • bash "&" 不打印 "[1]+ Done "

    我在 bashrc 中调用一个脚本来打印打开终端时收到的新消息数 我希望该调用在访问网络时是非阻塞的 有时需要几秒钟 这意味着我无法使用终端直到完成 但是如果我输入 mailcheck 在我的 bashrc 中 它工作正常 但然后打印一个空

随机推荐

  • IPython Notebook:默认编码是什么?

    我已经使用 utf 8 编码创建了一个包 当调用一个函数时 它返回一个DataFrame 其中有一列以 utf 8 编码 在命令行使用 IPython 时 显示该表的内容没有任何问题 使用笔记本时 它崩溃并出现错误 utf8 codec c
  • 通用 getter 和 setter 方法[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在尝试编写一个抽象类 这个类将是一个 Field 会有不同类型的字段 需要扩展字段类并编写自己的 setter 类 例如 将会有一个字符
  • ZipArchive 在 Laravel 中不起作用

    我有 laravel 项目 想要添加压缩文件的功能 我正在使用 php ZipArchive 当我尝试仅使用 PHP 创建 ZIP 文件时 我很幸运 但是当我尝试使用 Laravel 时 未创建 zip 文件 所以我添加了 使用ZipArc
  • 时间:2019-03-17 标签:c++STLmin_element

    我想找到数组中的最小元素 但如果最小元素出现多次 那么我想要该元素的最后一次出现 我用了std min element 和我的comp 功能 vector
  • Julia 浮点比较为零

    julia gt r 3 3 Array Float64 2 1 77951 0 79521 2 57472 0 0 0 630793 0 630793 0 0 0 0 1 66533e 16 julia gt sort abs diag
  • 使用核心转储在 Linux 中进行调试

    使用 GDB 调试核心转储时的 最佳实践 是什么 目前 我面临一个问题 我的应用程序的发行版是在没有 g 编译器标志的情况下编译的 我的应用程序的调试版本 使用 g 编译 已存档 以及源代码和发布二进制文件的副本 最近 当用户给我一个核心转
  • 如何将图像保存为变量?

    现在 我有一个带有精灵的 python 游戏 它从其目录中的文件中获取图像 我想让它变得我什至不需要这些文件 不知何故 将图像预先存储在变量中 以便我可以从程序中调用它 而无需额外的 gif 文件的帮助 我使用图像的实际方式是 image
  • 如何在jsp中显示图片?

    我有一个字节数组图像 我需要在 jsp 页面中以 jpg 格式显示该图像 单击该图像时 我可以将图像下载到我的电脑上 我正在从 mysql 数据库将图像加载为字节数组 我的代码是 ResultSet res statement execut
  • SCORM 1.2 API 示例/教程

    我花了相当多的时间搜索 SCORM 1 2 API 教程 示例 结果证明这是一项相当困难的任务 我发现的唯一样本是这样的 http www vsscorm net 2009 05 30 ground rules http www vssco
  • maven-compiler-plugin:jar:3.8.1 丢失

    尝试使用 3 8 1 而不是 3 8 0 但收到消息 警告 org apache maven plugins maven compiler plugin jar 3 8 1 的 POM 丢失 没有可用的依赖信息 我的 pom xml 在 3
  • 如果 File 不存在,如何确定它是否是文件或目录?

    File isFile and File isDirectory 不仅当File不是指定的类型 而且当File其本身不存在于文件系统上 如何判断是否File当文件或目录不存在时代表它 一般来说 一个特定的路径既可以代表一个目录 也可以代表一
  • 使用 Node.JS

    昨晚我转储了 Windows 7 并格式化了我的硬盘驱动程序以移植到基于 Linux 的操作系统 纯粹是因为我想开始使用Node JS 所以我已经安装了Node JS并做了一些测试 http 服务器和套接字等 我想做的是构建一个与 MVC
  • 如何使用 pgAdmin 添加几何列

    我正在使用在 PostgreSQL 中创建的数据库 在其架构中有两个表 我想在其中一个表中添加一个geometry柱子 问题是我创建了 postgis 扩展 CREATE EXTENSION postgis 对于数据库 但我无法使用 pgA
  • MVC AuthenticationManager.SignOut() 未注销

    我的项目基于 Visual Studio 2013 中的 MVC 5 项目模板 个人用户帐户选项 我一直依赖用户的默认登录和注销方法 但我不确定我做了什么 在某些时候 用户无法再注销 但他们可以以其他用户的身份登录 这是帐户控制器的默认注销
  • 是否有一种补充方法来获取鼠标事件之类的东西?

    直接使用 jQuery 如果我有一个固定框 例如 一个彩色矩形 并且将鼠标移入或移出其中 则如果我将鼠标光标以一种或另一种方式移动到框的边界上 jQuery 就会给我事件 如果我有一个以编程方式移动的彩色矩形 例如向右移动 然后我将鼠标放在
  • 无法在模拟器中运行应用程序:运行时遇到错误(域 = LaunchServicesError,代码 = 0)

    在 Xcode 6 中成功编译项目后 我无法在模拟器中运行它并显示上述消息 我做了所有可能的研究 尝试了一切 但仍然没有任何进展 我不使用 swift 也不使用小部件或扩展 因此请不要建议由这些引起的解决方案 如类似问题中所示 如果有人发现
  • Applet 与 Servlet

    JAVA中Applet和Servlet有什么区别 Applet运行在客户端 servlet运行在服务器上 就这么简单 更具体地说 该小程序被下载到客户端 并在浏览器内的 JRE 中执行 并且可以在小程序框架内显示它想要显示的任何内容 相反
  • 屏幕抓取建议:交互式图表

    我最近学习了一些关于如何在 Python 中使用 BeautifulSoup 的教程 并学习了如何简单地从网页中抓取文本和 URL 我现在正在尝试从以下链接中抓取数据 http www study cam ac uk undergradua
  • ClosedXML 添加图像

    我可以使用 OpenXML 将图像添加到 Excel 电子表格中 然而 对于程序的其余部分 我使用 ClosedXML 来添加数据 我可以使用列和行索引在特定单元格添加数据 如果我可以将图像添加到 Excel 它目前似乎是一个单独的层 悬停
  • 解析可选参数和非可选参数

    我是 bash 的新手 在阅读并尝试了很多有关如何解析参数的内容后 我无法做我真正想做的事情 我想解析可选参数和非可选参数 更具体地说 我想解析 3 个参数 第一个 fastaq 文件 第二个 第二个可选 fastaq 文件 第三个参数将是