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