添加选项到您的shell脚本。终端命令通常有选项或开关,用户可以使用它们来修改命令的执行方式。选项在命令行界面的POSIX规范中指定,这是最早的UNIX应用程序建立的长期约定,因此当您创建自己的命令时,最好知道如何在脚本中将选项包含到Bash中.与大多数语言一样,有多种方法可以解决Bash中解析选项的问题。但直到今天,我最喜欢的方法仍然是我第一次发现Linux时从PatrickVolkerding的Slackware构建脚本中学到的方法,并冒险研究操作系统附带的纯文本文件。shell脚本指南。Bash中的选项解析Bash中解析选项的策略是遍历传递给shell脚本的所有参数,确定它们是否是一个选项,然后继续处理下一个参数。重复此过程,直到没有剩余选项。#!/bin/bashwhile[True];doif["$1"="--alpha"-o"$1"="-a"];thenALPHA=1shift1elsebreakfidoneecho$ALPHA在这段代码中,我创建了一个while循环,它循环直到处理完所有参数。if语句将尝试将在第一个位置($1)中找到的参数与--alpha或-a匹配。(这里的to-match是一个任意的选项名,没有特殊含义,在实际脚本中可以使用--verbose和-v来触发verbose输出)。shift关键字将所有参数移动一位,以便将位置2($2)的参数移动到位置1($1)。else语句在处理完所有参数后触发,这会中断while循环。在脚本的最后,$ALPHA的值被输出到终端。测试这个脚本:$bash./test.sh--alpha1$bash./test.sh$bash./test.sh-a1你可以看到选项被正确检测到。在Bash中检测参数但是上面的脚本有一个问题:多余的参数被忽略了。$bash./test.sh--alphafoo1$要捕获不是选项名称的参数,请将剩余的参数转储到Bash数组中。#!/bin/bashwhile[True];doif["$1"="--alpha"-o"$1"="-a"];thenALPHA=1shift1elsebreakfidoneecho$ALPHAARG=("${@}")foriin${ARG[@]};doecho$idone测试新版脚本:$bash./test.sh--alphafoo1foo$bash./test.shfoofoo$bash./test.sh--alphafoobar1foobarwithparameteroptions一些选项需要传递入参。例如,您可能希望允许用户设置颜色或图形分辨率等属性,或将应用程序指向自定义配置文件。要在Bash中执行此操作,您仍然可以像布尔开关一样使用shift关键字,但参数需要移动两位而不是一位。#!/bin/bashwhile[True];doif["$1"="--alpha"-o"$1"="-a"];thenALPHA=1shift1elif["$1"="--config"-o"$1"="-c"];thenCONFIG=$2shift2elsebreakfidoneecho$ALPHAecho$CONFIGARG=("${@}")foriin${ARG[@]};doecho$idone在这段代码中,我添加了一个elif子句来比较每个参数使用--config和-c。如果匹配,名为CONFIG的变量的值将设置为下一个参数的值(这意味着--config选项需要一个参数)。所有参数都移动两位:一位跳过--config或-c,一位跳过其参数。与上一节一样,循环重复直到没有匹配的参数。这是对新版本脚本的测试:$bash./test.sh--configmy.conffoobarmy.confbaz$bash./test.sh-a--configmy.confbaz1my.confbazBash使选项解析变得容易和一些其他方法在Bash中也有可用的解析选项。您可以改用case语句或getopt命令。无论使用何种方法,为用户提供选项都是应用程序的一项重要功能,而Bash使解析选项成为一件简单的事情。
