我正在尝试编写一个包含选项的bash脚本。 让我们称这些选项为A和B.
在脚本中,A和B可能会也可能不会被定义为变量。
我希望能够检查变量是否已定义。
我尝试了以下但不起作用。
if [ ! -n $1 ]; then
echo "Error"
fi
由于
答案 0 :(得分:1)
测试变量是否设置的“正确”方法是使用+
扩展选项。您会在configure
脚本中看到很多内容:
if test -s "${foo+set}"
如果设置${foo+set}
,则"set"
扩展为""
,如果不设置,则${foo:+set}
扩展为$foo
。如果需要,这允许设置变量但是为空。 $(eval echo $a)
还要求${foo:?}
不为空。
(那:
有问题:它很慢,而且很容易受到代码注入(!)。)
哦,如果你只是想在没有设置所需的东西时抛出一个错误,你可以将变量称为${foo:?Please specify a foo.}
(如果设置则保留{{1}}但允许为空),或者是自定义错误消息{{1}}。
答案 1 :(得分:0)
不要这样做,试试这个:
if [[ -z $1 ]]; then
echo "Error"
fi
您的版本中的错误实际上是缺少引用 应该是:
if [ ! -n "$1" ]; then
echo "Error"
fi
但是你不需要否定,而是使用-z
。
如果你使用Bash,那么也可以使用双括号[[
]]
。
来自man bash
页面:
-z string True if the length of string is zero. -n string True if the length of string is non-zero.
此外,如果您使用bash v4或更高版本(bash --version
),那么-v
-v varname True if the shell variable varname is set (has been assigned a value).
答案 2 :(得分:0)
您没有定义如何传递这些选项,但我认为:
if [ -z "$1" ]; then
echo "Error"
exit 1
fi
正是您要找的。 p>
但是,如果其中一些选项是错误的,可选的,那么您可能需要以下内容:
#!/bin/bash
USAGE="$0: [-a] [--alpha] [-b type] [--beta file] [-g|--gamma] args..."
ARGS=`POSIXLY_CORRECT=1 getopt -n "$0" -s bash -o ab:g -l alpha,beta:,gamma -- "$@"`
if [ $? -ne 0 ]
then
echo "$USAGE" >&2
exit 1
fi
eval set -- "$ARGS"
unset ARGS
while true
do
case "$1" in
-a) echo "Option a"; shift;;
--alpha) echo "Option alpha"; shift;;
-b) echo "Option b, arg '$2'"; shift 2;;
--beta) echo "Option beta, arg '$2'"; shift 2;;
-g|--gamma) echo "Option g or gamma"; shift;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
echo Remaining args
for arg in "$@"
do
echo '--> '"\`$arg'"
done
exit 0
答案 3 :(得分:0)
诀窍是“ $ 1”,即
root@root:~# cat auto.sh
Usage () {
echo "error"
}
if [ ! -n $1 ];then
Usage
exit 1
fi
root@root:~# bash auto.sh
root@root:~# cat auto2.sh
Usage () {
echo "error"
}
if [ ! -n "$1" ];then
Usage
exit 1
fi
root@root:~# bash auto2.sh
error