当前位置:   article > 正文

shell脚本处理命令行参数_shell 脚本参数处理模板

shell 脚本参数处理模板

getopt

getopt 可以处理命令行参数

命令行参数有

  • 选项参数

    • 短选项

    • 长选项

    • 带值短选项

    • 带值长选项

  • 非选项参数

    • 普通参数

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

示例

短选项

./test.sh -v
./test.sh -a -b
  • 1
  • 2

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

长选项

./test.sh --version
./test.sh --about --break
  • 1
  • 2

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

带值短选项

./test.sh -a hello
  • 1

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

带值长选项

./test.sh --app hello
  • 1

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

非选项参数

./test.sh a b c
  • 1

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

使用

test.sh

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

其中$()表示执行命令 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
  • 1

输出

-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
  • 1
  • 2

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

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

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

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

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

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

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

-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 $@
  • 1
  • 2
  • 3
  • 4
  • 5

运行

./test 1 2 3
  • 1

输出

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

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 "剩余参数" "$@"

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

运行

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

运行结果

help
--app的参数为app
剩下了普通参数,匹配终止
剩余参数 1 2 3
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/216036
推荐阅读
相关标签
  

闽ICP备14008679号