shell脚本处理命令行参数

getopt

getopt 可以处理命令行参数

命令行参数有

  • 选项参数

    • 短选项

    • 长选项

    • 带值短选项

    • 带值长选项

  • 非选项参数

    • 普通参数

这里说的非选项参数就是普通参数

示例

短选项

./test.sh -v
./test.sh -a -b

-v -a -b这种都是短选项

长选项

./test.sh --version
./test.sh --about --break

--version --about --break这种就是长选项

带值短选项

./test.sh -a hello

其中 -a hello 是带值短选项,hello是-a选项的值

带值长选项

./test.sh --app hello

其中 --app hello 是带值短选项,hello是 -app 选项的值

非选项参数

./test.sh a b c

这里有3个参数 a b c,属于非选项参数

使用

test.sh

options=$(getopt -o ab --long ccc,ddd -- "$@")
echo $options

其中$()表示执行命令 getopt -o ab --long c,d -- "$@"

  • -o ab: 这里 -o 表示短选项(short options),ab 是有效的短选项列表。每个字母代表一个可用的短选项。这里有两个短选项,ab
  • --long ccc,ddd: 这里 --long 表示长选项(long options),ccc,ddd 是有效的长选项列表。每个长选项由逗号 , 分隔,ccc 和 ddd 是有效的长选项。
  • --: 这是一个特殊的标记,它告诉 getopt 在解析选项和参数时停止。在 -- 之后的内容都被视为参数而不是选项
  • "$@": 这是一个特殊的变量,它包含所有传递给脚本的参数。"$@" 保留了参数中的空格和引号。

比如我们输入

./test.sh -a -b --ccc --ddd 1 2 3

输出

-a -b --ccc --ddd -- '1' '2' '3'

-a -b --ccc --ddd: 表示我们定义的短选项和长选项 ,--后面的是普通参数 1 2 3

再修改下test.sh

options=$(getopt -o ab::c: --long ccc,ddd: -- "$@")
echo $options

我们-o指定的短选项: ab::c:

  • a: 没有冒号,表示指示-a后面不需要任何参数
  • b::有两个冒号,表示后面的参数是可选的
  • c::有一个冒号表示后面必选一个参数值

--long指定的长选项 ccc,ddd:和短选项一样,有一个冒号表示后面必须跟一个参数

./test.sh -b hello --ddd 1212 

-b '' --ddd '1212' -- 'hello'

可以看到-b指定了一个hello值但是把hello识别成了普通参数,如果时可选参数,段选项和长选项有不同的指定方式

./test.sh -bhello --ddd=1212

-b 'hello' --ddd '1212' --

可以看到-bhello,hello参数需要紧贴-b选项,而长选项的可选项使用 =来指定参数

实战

这里引入连个命令

  • shift:参数全部左移
  • set -- "string":重新设置命令行参数
  • eval: eval 是一个用于在Shell脚本中执行字符串作为Shell命令的内置命令。它的作用是将传递给它的参数当作Shell命令进行解析和执行。eval 命令的使用场景通常是在需要动态生成Shell命令的情况下。通过将命令保存在字符串中,可以在运行时根据不同的情况动态生成不同的Shell命令,然后使用eval执行这些命令。

使用test.sh举例

echo $@
eval set -- "-a hello --app app"
echo $@
shift 1
echo $@

运行

./test 1 2 3

输出

1 2 3
-a hello --app app
hello --app app

eval执行了set -- "-a hello --app app" 这个命令

set – 指定了新的命令行参数 -a hello --app app

随后shift左移了所有参数 也就是 shift 2就是左移两下

#!/bin/bash

# 处理参数
options=$(getopt -o h --long help,app: -- "$@")
eval set -- "$options" 

while true; do
# echo $1;
    case $1 in
        -h|--help)
            echo help;
            ;;
        --app)
            echo '--app的参数为'"$2"
            shift 1
            ;;
        --)
            echo "剩下了普通参数,匹配终止"
            shift 1
            break
            ;;
        *)
            echo "未知选项"
            # exit
            break
            ;;
        esac
        shift
done
echo "剩余参数" "$@"

运行

./test.sh -h --app app 1 2 3

运行结果

help
--app的参数为app
剩下了普通参数,匹配终止
剩余参数 1 2 3
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值