Answers:
它是:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
该$#
变量将告诉您脚本传递的输入参数的数量。
或者您可以检查参数是否为空字符串,例如:
if [ -z "$1" ]
then
echo "No argument supplied"
fi
该-z
开关是检验的“$ 1”的扩张是一个空字符串或没有。如果为空字符串,则执行主体。
exit 1
当脚本需要参数时,您可能想在if块的回显末尾添加一个。显而易见,但值得注意的是完整性。
programname "" secondarg third
。该$#
检查明确检查参数的数量。
if [ ! -z "$1" ]; then ...
最好以此方式演示
if [[ $# -eq 0 ]] ; then
echo 'some message'
exit 1
fi
如果参数太少,通常需要退出。
exit 1
它通常具有您想要的,并使用[[ ]]
通常更合理的测试(iirc)。因此,对于盲目复制粘贴代码的人来说,这是更好的答案。
在某些情况下,您需要检查用户是否向脚本传递了参数,如果没有,则返回默认值。就像下面的脚本一样:
scale=${2:-1}
emulator @$1 -scale $scale
在这里,如果用户尚未scale
作为第二个参数传递-scale 1
,则默认情况下会启动Android模拟器。${varname:-word}
是扩展运算符。还有其他扩展运算符:
${varname:=word}
其中设置了未定义varname
而不是返回的word
值;${varname:?message}
它要么返回(varname
如果已定义)并且不为null,要么输出message
并中止脚本(如第一个示例);${varname:+word}
返回word
仅当varname
被定义并且不为空; 否则返回null。${varname?message}
。是多余:
的打字错误,还是会改变行为?
: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
尝试:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi
$#
和0
?
else
。
foo*
,扩展文件名,如)和单词拆分(即,如果值包含空格,则拆分内容)。在这种情况下,不必引用,$#
因为这两种情况都不适用。用引号0
也不是必需的,但是有些人喜欢用引号,因为它们实际上是字符串,这使它更明确。
检测参数是否传递到脚本的另一种方法:
((!$#)) && 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.
exit
杀死我的zsh进程,而是使用return
不杀死zsh进程
((!$#))
触发历史记录替换?
如果要检查参数是否存在,可以检查参数#是否大于或等于目标参数编号。
以下脚本演示了它是如何工作的
#!/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
作为一个小提醒,数字测试运营商猛砸只在整数的工作(-eq
,-lt
,-ge
等)
我想确保我的$ vars是整数
var=$(( var + 0 ))
在测试它们之前,只是为了防止出现[[:必需的整数arg]错误。
var=$(printf "%.0f" "$var")
可以处理浮点数,但在给定字符串时会遭受非零退出。如果您不介意awk,那么我使用的这种方法似乎是强制执行整数的最可靠方法:var=$(<<<"$var" awk '{printf "%.0f", $0}')
。如果未设置var,则默认为“ 0”。如果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
}
添加验证以检查整数
要添加其他验证,例如检查传递的参数是否为整数,请修改验证一个内衬以调用验证函数:
: ${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
}
[ -z "$1" ] && echo "No argument supplied"
我更喜欢单线,因为它们对我来说更容易。与使用if