Shell: 将环境变量作为具名参数使用

建议点击 查看原文 查看最新内容。

原文链接: https://typonotes.com/posts/2023/07/13/shell-using-env-var-as-named-arg/

1. 位置参数

在 Shell 中, 最常用的参数就是 位置参数

1
2
3
4
#!/bin/bash
echo '$1 =' $1
echo '$2 =' $2
echo '$11 =' ${11}

执行结果如下

1
2
3
4
$ bash pos-var.sh 1 2 3 4 5 6 7 8 9 10 abc111 
$1 = 1
$2 = 2
$11 = abc111

位置参数

  1. 使用数字表示对应的参数的位置, 不具有明确的 语义
  2. 修改输入参数位置影响执行结果。

可以考虑使用内置变量名削弱影响。

1
2
3
4
5
6
#!/bin/bash

Name=$1
Age=$2

echo Name=$Name, Age=$Age

当参数位置变换后, 修改内置变量对应位置即可。

1
2
3
4
5
#!/bin/bash
Name=$2
Age=$1

echo Name=$Name, Age=$Age

2. 使用 getopts 参数解析工具

使用 getopts 可以通过 -n 这样的参数选项控制变量的位置。 是一种常用的方式。

但我个人并不喜欢这种, 觉得麻烦。

之前的笔记已经找不到, 可以参考 Shell脚本中的while getopts用法小结

核心变量赋值代码如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash

upload=false # 默认值
while getopts 'h:j:m:u' OPT; do
    case $OPT in
        j) S_DIR="$OPTARG";;
        m) D_DIR="$OPTARG";;
        u) upload="true";;
    esac
done

echo S_DIR=$S_DIR
echo D_DIR=$D_DIR
echo upload="$upload"

执行结果

1
2
3
4
5
$ bash getopts-var.sh -j /tmp/src -m /tmp/dest

S_DIR=/tmp/src
D_DIR=/tmp/dest
upload=false

可以看到, 是通过 while 循环case 判断 进行变量捕捉并赋值。

与之配合的还有一个 Shell 内置方法 shift 可以改变变量位置。 每次调用, 当前队列 $2变成了$1, $3变成了$2, 依次类推。 最终变成一个 新队列

这个忘了、也不用, 就不展开了。

3. 把环境变量作为具名参数

这种方式是我现在比较喜欢用的。

  1. 不在依赖变量的位置了。
  2. 可以同时设置默认值。

要说不方便就是 参数前置 了。 和平常的使用习惯不一样。

1
2
3
4
5
6
7
8
#!/bin/bash

## 获取环境变量,或设置默认值
NAME=${Name:=Zhangsan}
AGE=${Age:=18}

## 执行逻辑
echo Name=${NAME}, Age=${AGE}

执行结果

1
2
3
4
5
6
7
# 使用默认值
$ bash named-arg.sh
Name=Zhangsan, Age=18

# 使用自定义值
$ Name=Wangwu Age=20 bash named-arg.sh 
Name=Wangwu, Age=20