检查Bash外壳脚本中输入参数的存在

我需要检查输入参数的存在。我有以下脚本

if [ "$1" -gt "-1" ]then echo hifi

我得到

[: : integer expression expected

如何首先检查输入参数1以查看它是否存在?

1770291 次浏览

它是:

if [ $# -eq 0 ]thenecho "No arguments supplied"fi

$#变量将告诉您脚本传递的进审量参数。

或者您可以检查参数是否为空字符串或不是:

if [ -z "$1" ]thenecho "No argument supplied"fi

-z开关将测试"$1"的扩展是否为空字符串。如果它是空字符串,则执行主体。

另一种检测参数是否传递给脚本的方法:

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

请注意,(( expr ))导致表达式按照Shell算术的规则进行评估。

为了在没有任何论据的情况下退出,可以说:

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

另一种(类似)的说法是:

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

help let表示:

let: let arg [arg ...]

  Evaluate arithmetic expressions.
...
Exit Status:If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.

尝试:

 #!/bin/bashif [ "$#" -eq  "0" ]thenecho "No arguments supplied"elseecho "Hello world"fi

作为一个小提醒,Bash中的数字测试运算符仅适用于整数(-eq-lt-ge等)。

我喜欢确保我的$vars是int by

var=$(( var + 0 ))

在我测试它们之前,只是为了防止“[: integer arg所需”错误。

这样演示比较好

if [[ $# -eq 0 ]] ; thenecho 'some message'exit 1fi

如果参数太少,通常需要退出。

在某些情况下,您需要检查用户是否向脚本传递了参数,如果没有,则回退到默认值。就像下面的脚本一样:

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

在这里,如果用户没有传递scale作为第二个参数,我默认使用-scale 1启动Android模拟器。${varname:-word}是一个扩展运算符。还有其他扩展运算符:

  • ${varname:=word}未定义varname而不是返回word值;
  • ${varname:?message},如果它已定义且不为空,则返回varname,或者打印message并中止脚本(如第一个示例);
  • ${varname:+word}仅在定义了varname且不为空时返回word;否则返回null。

如果您想检查参数是否存在,您可以检查参数#是否大于或等于您的目标参数编号。

以下脚本演示了它是如何工作的

test.sh

#!/usr/bin/env bash
if [ $# -ge 3 ]thenecho script has at least 3 argumentsfi

产生以下输出

$ ./test.sh~$ ./test.sh 1~$ ./test.sh 1 2~$ ./test.sh 1 2 3script has at least 3 arguments$ ./test.sh 1 2 3 4script has at least 3 arguments

我经常将此代码段用于简单的脚本:

#!/bin/bash
if [ -z "$1" ]; thenecho -e "\nPlease call '$0 <argument>' to run this command!\n"exit 1fi

只是因为有一个更基点要指出,我将补充说,你可以简单地测试你的字符串是否为空:

if [ "$1" ]; thenecho yeselseecho nofi

同样,如果你期待参数计数,只需测试你的最后一个:

if [ "$3" ]; thenecho has args correct or notelseecho fixmefi

依此类推任何arg或var

单线性bash函数验证

myFunction() {
: ${1?"forgot to supply an argument"}if [ "$1" -gt "-1" ]; thenecho hifi
}

添加函数名称和用法

myFunction() {
: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage:  ${FUNCNAME[0]} some_integer"}if [ "$1" -gt "-1" ]; thenecho hifi
}

添加验证以检查是否为整数

要添加额外的验证,例如检查传递的参数是否为整数,请修改验证一行以调用验证函数:

: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage:  ${FUNCNAME[0]} some_integer"} && validateIntegers $1 || die "Must supply an integer!"

然后,构造一个验证参数的验证函数,成功时返回0,失败时返回1,失败时返回一个中止脚本的die函数

validateIntegers() {
if ! [[ "$1" =~ ^[0-9]+$ ]]; thenreturn 1 # failurefireturn 0 #success
}
die() { echo "$*" 1>&2 ; exit 1; }

更简单-只需使用set -u

set -u确保每个引用的变量在使用时都已设置,因此只需设置它并忘记它

myFunction() {set -uif [ "$1" -gt "-1" ]; thenecho hifi
}

在我的情况下(有7个参数),唯一有效的解决方案是检查最后一个论点是否存在:

if [[ "$7" == '' ]] ; thenecho "error"exitfi

更现代

#!/usr/bin/env bash
if [[ $# -gt 0 ]]then echo Arguments were provided.else echo No arguments were provided.fi