测试变量是否未设置似乎很容易。我至少知道三种方法:
#!/bin/ksh
unset var
[ "$#" -gt 0 ] && var=$1
[ "${var+set}" != "${var}" ] && echo set1 || echo unset1
[ "${var+set}" ] && echo set2 || echo unset2
[[ -v var ]] && echo set3 || echo unset3
执行它:
$ ./script
unset1
unset2
unset3
也尝试使用./script ''
和./script 'value'
。
但是,只需将变量名称更改为IFS
,所有三个测试都会失败:
#!/bin/ksh
unset IFS
[ "$#" -gt 0 ] && IFS=$1
[ "${IFS+set}" != "${IFS}" ] && echo set1 || echo unset1
[ "${IFS+set}" ] && echo set2 || echo unset2
[[ -v IFS ]] && echo set3 || echo unset3
有没有办法实际测试IFS
ksh93 中是否未设置?
答案1
是的,这是可能的。一种方法(可能不是最简单的,但确实有效)是检查所有变量的列表是否包含该变量:
if [[ `set | grep ^IFS= | wc -l` == 0 ]]; then
echo "IFS variable is unset (not declared)"
fi
或者,没有wc
(感谢@Kusalananda,请参阅下面的注释):
if set | ! grep -q ^IFS= ; then
echo "IFS variable is unset (not declared)"
fi