拥有包含ip_address
变量的以下文本文件。文件如下
$ cat file
ip_address=10.78.1.0
filename=test.bin
现在使用bash脚本检查ip_address
是否已定义(或可用或不可用)
#!/bin/bash
for list in $(cat file)
do
eval $list
done
${ip_Address:?Error \$IP_Address is not defined}
[ -z ${ip_Address:-""} ] && printf "No IPaddress\n" || echo "$ip_Address"
现在,如果我的文件不包含ip_address
变量的行,那么脚本会在此处中断,但如果有,则再次检查ip_adress
是否包含任何非值的值。
但是如果变量不可用,我不想破坏我的脚本
像
#!/bin/bash
for list in $(cat file)
do
eval $list
done
if [ variable not available ]
then
#do something
else
#check variable set or not
[ -z ${ip_Address:-""} ] && printf "No IP address\n" || echo "$ip_Address"
fi
尝试使用-z
标志(实际上这个标志检查变量是否为空,但不是变量的可用性),如此
if [ -z $ip_Address ]
then
#do something
else
#rest of code
fi
但它在以下条件下失败
案例1: 如果我的文件如下
$ cat file
filename=test.bin
然后它必须进入if..
块并且它确实。所以它不是问题
案例2:
如果我的文件如下
$ cat file
ip_address=
filename=test.bin
然后它必须进入else..
区块,但它不会。所以这是问题
那么我如何区分bash中可用的变量定义或变量?
答案 0 :(得分:3)
您可以使用${var-value}
替换区分unset,set but empty和non-empty。
case ${ip_address-UNSET} in UNSET) echo "It's unset." ;; esac
case ${ip_address:-EMPTY} in EMPTY) echo "It's set, but empty." ;; esac
case ${ip_address:+SET} in SET) echo "It's set and nonempty." ;; esac
这只是为了示范;你的逻辑可能看起来很不一样。
另见http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
答案 1 :(得分:3)
如果您正在使用bash
4.2(最新版本,尽管应尽快发布4.3版本......),您可以使用-v
条件运算符来测试是否设置了变量。
if [[ -v ip_Address ]]; then
printf "ip_Address is set\n";
fi
请注意,-v
的参数是您正在测试的变量的名称,因此请不要在其前面添加$
。
答案 2 :(得分:1)
使用测试的-n
标志而不是-z
。
这将测试变量是否具有内容,并且还将识别变量是否未设置。
if [ -n "$ip_Address" ]
then
# ip_address is set
else
# ip_address is no content OR is not set
fi
答案 3 :(得分:0)
对我来说,以下几行可以胜任:
#!/bin/bash
if test $# -ne 1;
then
echo "Usage: check_for_ip.sh infile"
exit
fi
. $1
test -z "${ip_address}" && echo "No IP address" || echo "IP address is: ${ip_address}"
Testfiles:
$ cat file1
ip_address=
filename=test.bin
$ cat file2
ip_address=10.78.1.0
filename=test.bin
$ cat file3
filename=test.bin
Testresults:
$ bash check_for_ip.sh file1
No IP address
$ bash check_for_ip.sh file2
IP address is: 10.78.1.0
$ bash check_for_ip.sh file3
No IP address
我不确定我是否理解这个问题,因为这看起来很像你的解决方案;也许你只是错过了测试中的“”。