字符串不是空格或null但它是什么?

时间:2013-12-30 10:33:05

标签: bash

我有一个名为Try1.txt的文件,其中包含字符串"结束日期:1/1/2014"
我有一个名为Try2.txt的文件,其中包含字符串"结束日期:"
我有一个名为myscript.sh的bash脚本,其中包含以下代码:

$ myscript.sh Try1.txt

这可以按预期工作。

$ myscript.sh Try2.txt

这不能按预期工作。
我也尝试将它与""和" "得到了相同的结果。
为什么它认为字符串不为空或为空?

END_DATE=$(grep "End Date" $1 | gawk -F":" '{print $2}' | sed -e 's/^[ \t]*//g')

if [ -n "${END_DATE##+([[:space:]])}" ];
then
    echo "END_DATE is not null or space"
    printf "END_DATE: %b\n" "$END_DATE"
else
    echo "what is it then?"
    printf "END_DATE: %b\n" "$END_DATE"
fi

if [ -n "$END_DATE" ]
then
    echo "END_DATE is not null"
else
    echo "END_DATE is null"<br>
fi

2 个答案:

答案 0 :(得分:1)

尝试if [ -z "$END_DATE" ]

-z必须用于NULL检查

答案 1 :(得分:1)

中你可以这样做:

if [[ ! $END_DATE ]]

这是有效的,因为空字符串是假的。

请注意,我使用的是[[ ]]语法,而不是[ ]。阅读差异here

但是!在您的情况下有更简单的方法:

endDate=$(grep -Pom 1 'End Date\s+:\s+\K.*' "$1")
if [[ $? = 0 ]]; then # $? is the return status of a previous command. Grep will return 0 if it found something, and 1 if nothing was found.
    echo "Date was found. Date=$endDate"
else
    echo 'Date was not found'
fi

这样您甚至不需要sedawk或其他任何内容 我还添加了'-m 1'以确保只找到一行。 "$1"周围的引号至关重要。