在Bash脚本中检查输入参数是否存在

在Bash脚本中检查输入参数是否存在

技术背景

在编写Bash脚本时,常常需要检查用户是否提供了必要的输入参数。根据不同的业务需求,可能需要判断参数是否存在、参数数量是否符合要求,或者在参数缺失时使用默认值。

实现步骤

检查参数数量

可以使用$#变量来获取脚本接收到的输入参数的数量。以下是一个简单的示例:

1
2
3
4
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi

上述代码中,如果脚本没有接收到任何参数,就会输出相应的提示信息。

检查单个参数是否为空

使用-z开关可以测试一个参数是否为空字符串:

1
2
3
4
if [ -z "$1" ]
then
echo "No argument supplied"
fi

如果第一个参数是空字符串,就会输出提示信息。

参数缺失时退出脚本

通常在参数数量不足时,需要退出脚本。示例如下:

1
2
3
4
if [[ $# -eq 0 ]] ; then
echo 'some message'
exit 1
fi

使用默认值

在某些情况下,如果用户没有提供某个参数,可以使用默认值。例如:

1
2
scale=${2:-1}
emulator @$1 -scale $scale

如果用户没有提供第二个参数scale,则默认使用1

检测参数是否传入的其他方式

1
((!$#)) && echo No arguments supplied!

(( expr ))会根据Shell算术规则计算表达式。

退出无参数脚本

1
((!$#)) && echo No arguments supplied! && exit 1

使用let命令

1
2
let $# || echo No arguments supplied
let $# || { echo No arguments supplied; exit 1; } # Exit if no arguments!

使用双中括号[[ ... ]]

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

if [[ $# -gt 0 ]]; then
echo "Get arguments: $@"
else
echo "No arguments were provided."
fi

$#返回参数数量,$@返回实际的参数。

检查特定位置的参数是否存在

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

if [ $# -ge 3 ]
then
echo script has at least 3 arguments
fi

核心代码

检查参数是否为整数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
validateIntegers() {

if ! [[ "$1" =~ ^[0-9]+$ ]]; then
return 1 # failure
fi
return 0 #success

}

die() { echo "$*" 1>&2 ; exit 1; }

myFunction() {

: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage: ${FUNCNAME[0]} some_integer"} && validateIntegers $1 || die "Must supply an integer!"
if [ "$1" -gt "-1" ]; then
echo hi
fi

}

使用set -u确保变量已设置

1
2
3
4
5
6
7
myFunction() {
set -u
if [ "$1" -gt "-1" ]; then
echo hi
fi

}

最佳实践

  • 使用双中括号[[ ... ]]:在大多数情况下,建议使用双中括号[[ ... ]],因为它允许转义特殊字符、使用正则表达式进行字符串匹配,以及在括号内使用逻辑运算符。
  • 参数验证:在函数中对参数进行验证,确保参数的类型和值符合要求。
  • 使用默认值:在参数缺失时,使用默认值可以提高脚本的健壮性。

常见问题

  • 整数测试错误:Bash中的数值测试运算符(如-eq-lt-ge等)仅适用于整数。为了避免出现[: integer arg required错误,可以在测试之前将变量转换为整数:
1
var=$(( var + 0 ))
  • 单中括号和双中括号的区别:单中括号[ ... ]是POSIX标准的测试命令,而双中括号[[ ... ]]是Bash扩展的测试命令。双中括号提供了更多的功能,但在使用#!/bin/sh时,可能需要使用单中括号。

在Bash脚本中检查输入参数是否存在
https://119291.xyz/posts/check-existence-of-input-argument-in-bash-script/
作者
ww
发布于
2025年5月23日
许可协议