在执行 shell 脚本时使用选项解析参数

Beg*_*ner -1 command-line bash scripts

我在脚本中有 5 个选项,例如获取 IP 地址、可用内存、CPU 使用率、主机名和用户名。

我想做一个脚本来获取所有输出或任何人。

例如 :

如果我执行

system_info.sh -i ip -fm free -c cpu -h host -u user
Run Code Online (Sandbox Code Playgroud)

或者

system_info.sh -all all
Run Code Online (Sandbox Code Playgroud)

那么它应该给出所有的输出。

如果假设我只想要一个输出,则需要运行相同的脚本

system_info.sh -fm free
system_info.sh -fm free -i ip
Run Code Online (Sandbox Code Playgroud)

我有这个想法,但我不知道如何设置这些选项并在脚本中进行验证。

请建议我如何设置这些选项

Geo*_*sen 5

我以前从未这样做过,但看到了这个,我学到了一些东西。您将需要bash getopts像这样使用该功能。这应该为您指明正确的方向:

while getopts i:f:c:h:u: option
do
 case "${option}"
 in
 i) ip=${OPTARG};;
 f) state=${OPTARG};;
 c) cpu=${OPTARG};;
 h) host=$OPTARG;;
 u) user=$OPTARG;;
 esac
done
Run Code Online (Sandbox Code Playgroud)

这是一个 while 循环,它使用getopts函数和所谓的optstring,在这种情况下是i:f:c:h:u:,以遍历参数。while 循环遍历optstring,其中包含可用于传递参数的标志,并将为该标志提供的参数值分配给变量option。然后 case 语句将变量的值分配option给一个全局变量,该变量可以在读取所有参数后使用。

冒号optstring表示相应标志需要值。在上面的示例中,所有标志后跟一个冒号:i:f:c:h:u:

这意味着,所有标志都需要一个值。例如,如果不希望iu标志具有值,则 optstring 将为i:f:c:h:u

例如:i:f:c:h:u:,optstring 开头的冒号具有完全不同的含义。它允许您处理 optstring 中未表示的标志。在这种情况下,“选项”变量的值设置为“?” 并且“OPTARG”的值被设置为意外标志。允许您显示合适的错误消息,通知用户错误。

getopts 忽略前面没有标志的参数。如果在调用脚本时未提供 optstring 中指定的标志,则不会发生任何事情,除非您在代码中专门处理这种情况。

没有办理任何参数getops仍然可以与常规的捕捉$1$2等变量。

简单的例子:

#!/bin/bash

while getopts "i:f:c:h:u:" opt
do
        case $opt in
                i)
                        echo "ip"
                        ;;
                f)
                        echo "free"
                        ;;
                c)
                        echo "cpu"
                        ;;
                h)
                        echo "host"
                        ;;
                u)
                        echo "user"
                        ;;
                *)
                        echo "Nothing to do"
                        ;;
        esac
done
Run Code Online (Sandbox Code Playgroud)

用法:

./h.sh -i ip -f free -c cpu -h host -u user
Run Code Online (Sandbox Code Playgroud)

结果:

ip
free
cpu
host
user
Run Code Online (Sandbox Code Playgroud)

来源:

https://www.lifewire.com/pass-arguments-to-bash-script-2200571

http://aplawrence.com/Unix/getopts.html

http://mywiki.wooledge.org/BashFAQ/035#getopts

http://mywiki.wooledge.org/ComplexOptionParsing

  • @user476625 如果此答案不能解决您的问题,请[编辑](https://askubuntu.com/posts/960115/edit) 并澄清说明您需要什么以及`getopts` 有什么问题,请停止垃圾邮件评论! (2认同)