执行 shell 脚本时解析带有选项的参数

执行 shell 脚本时解析带有选项的参数

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

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

例如 :

如果我执行

system_info.sh -i ip -fm free -c cpu -h host -u user

或者

system_info.sh -all all

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

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

system_info.sh -fm free
system_info.sh -fm free -i ip

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

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

答案1

我以前从未这样做过,但看到这个后我学到了一些东西。您将需要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

这是一个 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

例如,optstring 开头的冒号:i:f:c:h:u:具有完全不同的含义。它允许您处理 optstring 中未表示的标志。在这种情况下,“option”变量的值设置为“?”,“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

用法:

./h.sh -i ip -f free -c cpu -h host -u user

结果:

ip
free
cpu
host
user

来源:

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

相关内容