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

我需要检查一个input参数的存在。 我有以下脚本:

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

我明白了

 [: : integer expression expected 

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

它是:

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

$#variables会告诉你脚本传入的input参数的数量。

或者你可以检查一个参数是否是一个空string或不像:

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

-z开关将testing“$ 1”的扩展是否为空string。 如果是空string,则执行正文。

这样做比较好

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

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

如果您只想检测是否缺less特定的参数,则参数replace非常重要:

 #!/bin/bash # usage-message.sh : ${1?"Usage: $0 ARGUMENT"} # Script exits here if command-line parameter absent, #+ with following error message. # usage-message.sh: 1: Usage: usage-message.sh ARGUMENT 

在某些情况下,您需要检查用户是否将parameter passing给脚本,如果不是,则返回到默认值。 像下面的脚本一样:

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

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

  • ${varname:=word}设置了未定义的varname而不是返回word值;
  • ${varname:?message}如果定义了它,它将返回varname如果不是null,或者输出message并中止脚本(如第一个例子);
  • ${varname:+word}仅在varname被定义且不为空的情况下返回word ; 否则返回null。

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

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

请注意(( expr ))导致expression式按照Shellalgorithm的规则进行评估。

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

 ((!$#)) && 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/bash if [ "$#" -eq "0" ] then echo "No arguments supplied" else echo "Hello world" fi 

作为一个小提醒,Bash中的数字testing运算符只能用整数( -eq-lt-ge等)

我喜欢确保我的$变数是由整数

 var=$(( var + 0 )) 

在我testing它们之前,只是为了防御“[:integer arg required”错误。

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

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

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