如何在Bash脚本中查找variables是否为空
如何检查bash中的variables是否为空?
在bash中,至less下面的命令testing$ var是否为空 :
if [[ -z "$var" ]]
命令man test
是你的朋友。
假设bash:
var="" if [ -n "$var" ]; then echo "not empty" else echo "empty" fi
我也看到了
if [ "x$variable" = "x" ]; then ...
这显然是非常强大和独立的壳。
而且,“空”和“未设”也有区别。 请参阅如何判断string是否未在bash shell脚本中定义? 。
if [ ${foo:+1} ] then echo "yes" fi
打印yes
如果variables设置。 ${foo:+1}
将在variables设置时返回1,否则返回空string。
[ "$variable" ] || echo empty : ${variable="value_to_set_if_unset"}
if [[ "$variable" == "" ]] ...
这个问题问如何检查一个variables是否是一个空string,并已经给出了最好的答案。
但是,在经过了一段时间的PHP编程之后,我到达了这里,而实际上我正在search的东西是像在bash shell中工作的php中的空白函数 。
在阅读答案后,我意识到我没有在bash中正确思考,但无论如何,在PHP这样的空函数将在我的bash代码中非常方便。
正如我认为这可能发生在其他人身上,我决定在bash中转换php空function
根据php手册 :
如果一个variables不存在或者它的值是下列值之一,则该variables被认为是空的:
- “”(一个空string)
- 0(0作为整数)
- 0.0(0作为浮点数)
- “0”(0作为一个string)
- 一个空的数组
- 一个variables声明,但没有价值
当然null和false的情况下不能在bash中转换,所以它们被省略了。
function empty { local var="$1" # Return true if: # 1. var is a null string ("" as empty string) # 2. a non set variable is passed # 3. a declared variable or array but without a value is passed # 4. an empty array is passed if test -z "$var" then [[ $( echo "1" ) ]] return # Return true if var is zero (0 as an integer or "0" as a string) elif [ "$var" == 0 2> /dev/null ] then [[ $( echo "1" ) ]] return # Return true if var is 0.0 (0 as a float) elif [ "$var" == 0.0 2> /dev/null ] then [[ $( echo "1" ) ]] return fi [[ $( echo "" ) ]] }
使用示例:
if empty "${var}" then echo "empty" else echo "not empty" fi
演示:
以下片段:
#!/bin/bash vars=( "" 0 0.0 "0" 1 "string" " " ) for (( i=0; i<${#vars[@]}; i++ )) do var="${vars[$i]}" if empty "${var}" then what="empty" else what="not empty" fi echo "VAR \"$var\" is $what" done exit
输出:
VAR "" is empty VAR "0" is empty VAR "0.0" is empty VAR "0" is empty VAR "1" is not empty VAR "string" is not empty VAR " " is not empty
话虽如此,在bash逻辑中,在这个函数中的零检查可能会导致一些问题,任何使用这个函数的人都应该评估这个风险,也许会决定把这些检查关掉,只留下第一个。
如果一个variables未被设置或设置为空string(“”),这将返回true
。
if [ -z "$MyVar" ] then echo "The variable MyVar has nothing in it." elif ! [ -z "$MyVar" ] then echo "The variable MyVar has something in it." fi
您可能想要区分未设置的variables和已设置的variables并清空:
is_empty() { local var_name="$1" local var_value="${!var_name}" if [[ -v "$var_name" ]]; then if [[ -n "$var_value" ]]; then echo "set and non-empty" else echo "set and empty" fi else echo "unset" fi } str="foo" empty="" is_empty str is_empty empty is_empty none
结果:
set and non-empty set and empty unset
顺便说一下,我推荐使用set -u
,这会在读取未设置的variables时导致错误,这可以帮助您避免类似的灾难
rm -rf $dir
您可以在这里阅读关于“严格模式”的这个和其他最佳实践。
检查variablesv是否未设置
if [ "$v" == "" ]; then echo "v not set" fi