检查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