我需要检查是否存在输入参数。我有以下脚本
if [ "$1" -gt "-1" ]
then echo hi
fi
我得到了
[: : integer expression expected
如何首先检查输入参数1以查看它是否存在?
答案 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)
如果您想检查参数是否存在,可以检查参数的数量是否大于或等于目标参数号。
以下脚本演示了这是如何工作的
#!/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