在 Bash 中解析命令行参数

Fumbani Banda 2023年1月30日 2022年5月14日
  1. 在 Bash 中解析位置参数
  2. 在 Bash 中使用标志解析​​参数
  3. 在 Bash 中使用循环结构解析参数
  4. 在 Bash 中使用 shift 解析参数
在 Bash 中解析命令行参数

本教程演示了使用标志、循环构造和移位运算符将命令行参数解析为 bash 脚本作为位置参数。

在 Bash 中解析位置参数

位置参数按照它们传递给 bash 脚本的顺序进行访问。第一个参数由 $1 访问,第二个参数由 $2 访问,依此类推。

echo "I am $1";
echo  "And I live in $2";

使用两个位置参数运行脚本:

bash positional_args.sh John USA

输出:

I am John
And I live in USA

在 Bash 中使用标志解析​​参数

标志以每个参数前的连字符 - 开头。使用标志时,参数的顺序无关紧要。

在下面的脚本中,getopts 从输入中读取标志,OPTARG 将其与相应的值匹配。

while getopts n:c: flag

do
    case "${flag}" in
          n) name=${OPTARG};;
          c) country=${OPTARG}
     esac
done
echo "I am $name";
echo  "And I live in $country";

跑:

bash flags.sh -n fumbani  -c Malawi

输出:

I am fumbani
And I live in Malawi

在 Bash 中使用循环结构解析参数

当参数大小事先未知时,循环结构很有用。$@ 是一个包含所有输入参数的变量。for 循环遍历所有参数并处理传递的每个参数。

i=1
for arg in "$@"
do
    printf "argument $i: $arg\n"
    i=$((i + 1 ))
done

跑:

bash arguments_loop.sh USA Europe Africa Asia

输出:

argument 1: USA
argument 2: Europe
argument 3: Africa
argument 4: Asia

在 Bash 中使用 shift 解析参数

shift 运算符使参数的索引从移位的位置开始。在我们的例子中,我们将参数移动 1 直到到达结尾。$# 指的是输入大小,而 $1 每次都指的是下一个参数。

i=1
max=$#
while (( $i <= $max ))
do
    printf "Argument $i: $1\n"
    i=$((i + 1 ))
    shift 1
done

跑:

bash shift.sh one two three

输出:

Argument 1: one
Argument 2: two
Argument 3: three
Fumbani Banda avatar Fumbani Banda avatar

Fumbani is a tech enthusiast. He enjoys writing on Linux and Python as well as contributing to open-source projects.

LinkedIn GitHub