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

时间:2011-06-26 05:49:21

标签: bash shell

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

if [ "$1" -gt "-1" ]
  then echo hi
fi

我得到了

[: : integer expression expected

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

11 个答案:

答案 0 :(得分:1922)

是:

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

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

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

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

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

答案 1 :(得分:284)

最好以这种方式展示

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

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

答案 2 :(得分:90)

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

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

如果用户未将scale作为第二个参数传递,则默认情况下我会使用-scale 1启动Android模拟器。 ${varname:-word}是一个扩展运营商。还有其他扩展运营商:

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

答案 3 :(得分:38)

尝试:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi

答案 4 :(得分:32)

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

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

请注意,(( expr ))会导致根据Shell Arithmetic规则评估表达式。

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

((!$#)) && 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.

答案 5 :(得分:18)

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

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi

答案 6 :(得分:8)

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

if [ "$1" ]; then
  echo yes
else
  echo no
fi

同样,如果您期望arg计数,只需测试最后一个:

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

以此类推,包含任何arg或var

答案 7 :(得分:3)

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

我喜欢确保我的$ vars是

var=$(( var + 0 ))

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

答案 8 :(得分:3)

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

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

test.sh

#!/usr/bin/env bash

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

产生以下输出

$ ./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

答案 9 :(得分:1)

一个划线员打击功能验证

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

}

添加验证以检查整数

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

: ${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]+$ ]]; 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

}

答案 10 :(得分:0)

对于我来说,检查最后一个参数是否存在的唯一可行解决方案是:

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