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

检查Bash shell脚本中是否存在输入参数,bash,shell,Bash,Shell,我需要检查输入参数是否存在。我有以下脚本 if [ "$1" -gt "-1" ] then echo hi fi 我明白了 如何首先检查输入参数1以查看它是否存在?它是: if[$#-eq 0] 然后 回显“未提供参数” fi $#变量将告诉您脚本传递的输入参数数量 或者,您可以检查参数是否为空字符串,如下所示: if [ -z "$1" ] then echo "No argument supplied" fi -z开关将测试“$

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

if [ "$1" -gt "-1" ]
  then echo hi
fi
我明白了

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

它是:

if[$#-eq 0]
然后
回显“未提供参数”
fi
$#
变量将告诉您脚本传递的输入参数数量

或者,您可以检查参数是否为空字符串,如下所示:

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

-z
开关将测试
“$1”
的扩展是否为空字符串。如果是空字符串,则执行正文。

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

((!$#)) && echo No arguments supplied!
请注意,
((expr))
导致表达式按照的规则求值

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

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

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

let $# || echo No arguments supplied

let $# || { echo No arguments supplied; exit 1; }  # Exit if no arguments!
帮助让
说:

let:let arg[arg…]

  Evaluate arithmetic expressions.

  ...

  Exit Status:
  If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
尝试:


作为一个小提示,Bash中的数字测试操作符只对整数起作用(
-eq
-lt
-ge
,等等)

我想确保我的$VAR是整数

var=$(( var + 0 ))

在测试它们之前,为了防止“[:integer arg required”错误。

最好用这种方式演示

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

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

在某些情况下,需要检查用户是否向脚本传递了参数,如果没有,则返回默认值。如下面的脚本所示:

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

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

如果要检查参数是否存在,可以检查参数数是否大于或等于目标参数数

下面的脚本演示了这是如何工作的

test.sh 生成以下输出

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

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

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi
!/bin/bash
如果[-z“$1”];则
echo-e“\n请调用“$0”以运行此命令!\n”
出口1
fi

这仅仅是因为还有一个基点需要指出,我要补充的是,您可以简单地测试字符串是否为空:

if [ "$1" ]; then
  echo yes
else
  echo no
fi
同样,如果您期望arg count,只需测试最后一个参数:

if [ "$3" ]; then
  echo has args correct or not
else
  echo fixme
fi

依此类推,使用任何arg或var进行一行bash函数验证

myFunction() {

    : ${1?"forgot to supply an argument"}
    if [ "$1" -gt "-1" ]; then
        echo hi
    fi

}
添加函数名和用法

myFunction() {

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

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

要添加其他验证,例如检查传递的参数是否为整数,请修改validation one liner以调用验证函数:

: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage:  ${FUNCNAME[0]} some_integer"} && validateIntegers $1 || die "Must supply an integer!"
然后,构造验证参数的验证函数,成功时返回0,失败时返回1,失败时返回中止脚本的骰子函数

validateIntegers() {

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

}

die() { echo "$*" 1>&2 ; exit 1; }
更简单-只需使用
set-u

set-u
确保每个引用的变量在使用时都已设置好,所以只需设置它并将其忘记即可

myFunction() {
    set -u
    if [ "$1" -gt "-1" ]; then
        echo hi
    fi

}

在我的例子中,检查最后一个参数是否存在的唯一有效解决方案是:

if [[ "$7" == '' ]] ; then
  echo "error"
  exit
fi

我喜欢这样做,语法简洁,POSIX仍然可以接受。
[-z“$1”]&&echo“未提供参数”
我更喜欢单行程序,因为它们对我来说更容易;与使用
if
相比,检查退出值也更快。当脚本运行需要参数时,您可能希望在if块内的回显末尾添加一个
exit 1
。很明显,但为了完整性,值得注意。不过,这是可能的很少有用,对于要初始化但为空的第一个参数;
programname“”secondarg third
$#
检查可以明确地检查参数的数量。对于noob,尤其是来自非脚本背景的noob,提及这些方面的一些特性也很重要。您还可以提到,在开始和结束大括号之后需要一个空格。否则不要工作。我自己是一个脚本编写能手(我来自C背景),并发现这很难。只有当我决定按原样复制整个东西时,事情才对我起作用。然后我意识到我必须在开始大括号之后和结束大括号之前留一个空格。对于可选参数
if[!-z“$1”];那么…
为什么您需要对
$$\code>和
0
使用双引号?如果我们在windows上使用不带双引号的$#和0这样的双引号,这是唯一的方法。这个答案为我刚刚编写的脚本提供了很好的起点。也感谢您显示
else
。@user13107 bash pr中的双引号变量事件全局化(即扩展文件名,如
foo*
)和分词(即如果值包含空格,则拆分内容)。在这种情况下,不必引用
$#
,因为这两种情况都不适用。引用
0
也是不必要的,但有些人更喜欢引用值,因为它们实际上是字符串,这使它更显式。不,不是这样的:这有您通常想要的
退出1
,并使用
[]]
test which(iirc)通常更合理。因此,对于盲目复制粘贴代码的人来说,这是更好的答案。要了解[]和[[]之间的区别,请参见上面的示例似乎使用了

validateIntegers() {

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

}

die() { echo "$*" 1>&2 ; exit 1; }
myFunction() {
    set -u
    if [ "$1" -gt "-1" ]; then
        echo hi
    fi

}
if [[ "$7" == '' ]] ; then
  echo "error"
  exit
fi