服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|

服务器之家 - 服务器系统 - Linux - 如何在 Bash shell 脚本中解析命令行选项

如何在 Bash shell 脚本中解析命令行选项

2021-08-30 23:26Linux中国Seth Kenlon Linux

关于命令行界面的 POSIX 规范 中就对选项做出了规范,这也是最早的 UNIX 应用程序建立的一个由来已久的惯例,因此你在创建自己的命令时,最好知道如何将选项包含进 Bash 脚本 中。

  • 给你的 shell 脚本添加选项。

终端命令通常具有 选项或开关,用户可以使用它们来修改命令的执行方式。关于命令行界面的 POSIX 规范 中就对选项做出了规范,这也是最早的 UNIX 应用程序建立的一个由来已久的惯例,因此你在创建自己的命令时,最好知道如何将选项包含进 Bash 脚本 中。

如何在 Bash shell 脚本中解析命令行选项

与大多数语言一样,有若干种方法可以解决 Bash 中解析选项的问题。但直到今天,我最喜欢的方法仍然是我从 Patrick Volkerding 的 Slackware 构建脚本中学到的方法,当我第一次发现 Linux 并敢于冒险探索操作系统所附带的纯文本文件时,这些脚本就是我的 shell 脚本的引路人。

Bash 中的选项解析

在 Bash 中解析选项的策略是循环遍历所有传递给 shell 脚本的参数,确定它们是否是一个选项,然后转向下一个参数。重复这个过程,直到没有选项为止。

  1. #!/bin/bash 
  2. while [ True ]; do 
  3. if [ "$1" = "--alpha" -o "$1" = "-a" ]; then 
  4.     ALPHA=1 
  5.     shift 1 
  6. else 
  7.     break 
  8. fi 
  9. done 
  10. echo $ALPHA 

在这段代码中,我创建了一个 while 循环,它会一直进行循环操作,直到处理完所有参数。if 语句会试着将在第一个位置($1)中找到的参数与 --alpha 或 -a 匹配。(此处的待匹配项是任意选项名称,并没有特殊意义。在实际的脚本中,你可以使用 --verbose 和 -v 来触发详细输出)。

shift 关键字会使所有参数位移一位,这样位置 2($2)的参数移动到位置 1($1)。处理完所有参数后会触发 else 语句,进而中断 while 循环。

在脚本的末尾,$ALPHA 的值会输出到终端。

测试一下这个脚本:

  1. $ bash ./test.sh --alpha 
  2. $ bash ./test.sh 
  3. $ bash ./test.sh -a 

可以看到,选项被正确地检测到了。

在 Bash 中检测参数

但上面的脚本还有一个问题:多余的参数被忽略了。

  1. $ bash ./test.sh --alpha foo 

要想捕获非选项名的参数,可以将剩余的参数转储到 Bash 数组 中。

  1. #!/bin/bash 
  2. while [ True ]; do 
  3. if [ "$1" = "--alpha" -o "$1" = "-a" ]; then 
  4.     ALPHA=1 
  5.     shift 1 
  6. else 
  7.     break 
  8. fi 
  9. done 
  10. echo $ALPHA 
  11. ARG=( "${@}" ) 
  12. for i in ${ARG[@]}; do 
  13.     echo $i 
  14. done 

测试一下新版的脚本:

  1. $ bash ./test.sh --alpha foo 
  2. foo 
  3. $ bash ./test.sh foo 
  4. foo 
  5. $ bash ./test.sh --alpha foo bar 
  6. foo 
  7. bar 

带参选项

有一些选项需要传入参数。比如,你可能希望允许用户设置诸如颜色或图形分辨率之类的属性,或者将应用程序指向自定义配置文件。

要在 Bash 中实现这一点,你仍然可以像使用布尔开关一样使用 shift 关键字,但参数需要位移两位而不是一位。

  1. #!/bin/bash 
  2. while [ True ]; do 
  3. if [ "$1" = "--alpha" -o "$1" = "-a" ]; then 
  4.     ALPHA=1 
  5.     shift 1 
  6. elif [ "$1" = "--config" -o "$1" = "-c" ]; then 
  7.     CONFIG=$2 
  8.     shift 2 
  9. else 
  10.     break 
  11. fi 
  12. done 
  13. echo $ALPHA 
  14. echo $CONFIG 
  15. ARG=( "${@}" ) 
  16. for i in ${ARG[@]}; do 
  17.     echo $i 
  18. done 

在这段代码中,我添加了一个 elif 子句来将每个参数与 --config 和 -c 进行比较。如果匹配,名为 CONFIG 的变量的值就设置为下一个参数的值(这就表示 --config 选项需要一个参数)。所有参数都位移两位:其中一位是跳过 --config 或 -c,另一位是跳过其参数。与上节一样,循环重复直到没有匹配的参数。

下面是新版脚本的测试:

  1. $ bash ./test.sh --config my.conf foo bar 
  2. my.conf 
  3. foo 
  4. bar 
  5. $ bash ./test.sh -a --config my.conf baz 
  6. my.conf 
  7. baz 

Bash 让选项解析变得简单

还有一些其他方法也可以解析 Bash 中的选项。你可以替换使用 case 语句或 getopt 命令。无论使用什么方法,给你的用户提供选项都是应用程序的重要功能,而 Bash 让解析选项成为了一件简单的事。

原文地址:https://linux.cn/article-13730-1.html

延伸 · 阅读

精彩推荐
  • LinuxLinux不用使用软件把纯文本文档转换成PDF文件的方法

    Linux不用使用软件把纯文本文档转换成PDF文件的方法

    将文本文件转换成PDF文件的方法有很多,不过在Linux系统中,不用使用软件也能将文本文本转换成PDF,而且很简单。下面为大家详细介绍下 ...

    服务器之家5692019-10-17
  • LinuxPython与sed,grep文本查找效率对比小测

    Python与sed,grep文本查找效率对比小测

    这篇文章主要针对python,sed与grep查找文本的效率做一个实验,方便以后选择使用什么工具,需要的朋友可以参考下 ...

    脚本之家3912019-11-27
  • Linux中国大陆开源镜像站汇总

    中国大陆开源镜像站汇总

    很多时候我们需要下载linux系统,但国外的下载点速度比较慢,这里特整理了一些国内的镜像站,大家可以收藏下 ...

    脚本之家2992019-11-11
  • Linuxlinux下用Proftpd搭建ftp服务器及配置

    linux下用Proftpd搭建ftp服务器及配置

    linux下搭建ftp服务器的软件是wuftp,现在真的时代变了,上网看一下几乎全世界的人都用proftpd了!赶个潮流,我也用proftpd在公司的一台备用小服务器上装上...

    Linux教程网3732019-12-28
  • LinuxLinux中使用ipvsadm配置LVS集群的基本方法

    Linux中使用ipvsadm配置LVS集群的基本方法

    这篇文章主要介绍了在Linux系统的服务器上使用ipvsadm配置LVS集群的基本方法,文中示例环境为CentOS系统,需要的朋友可以参考下...

    OSChina2162019-07-04
  • LinuxLinux系统中quota磁盘命令的相关使用解析

    Linux系统中quota磁盘命令的相关使用解析

    这篇文章主要介绍了Linux系统中quota磁盘命令的相关使用解析,包括edquota和quotacheck的命令的用法讲解,需要的朋友可以参考下...

    Linux命令手册3942019-06-24
  • LinuxLinux红外驱动重点解析

    Linux红外驱动重点解析

    初次接触Linux内核,好仔细阅读顶层目录的readme文件,它是Linux内核的概述和编译命令说明。readme的说明侧重于X86等通用的平台,对于某些特殊的体系结构,...

    良许Linux6682021-05-22
  • LinuxLinux 备份 恢复方法

    Linux 备份 恢复方法

    无论什么系统,最安全的做法。就是调试好后,做个 备份 。到时遇到什么大问题,直接 恢复 出来,方便而省事。下面详细 Linux 备份与恢复方法: 备份与...

    Linux教程网3652020-04-11