测试字符串在Bash中是否包含非空白字符

时间:2012-03-19 09:24:48

标签: linux string bash if-statement comparison

我的脚本正在阅读并显示id3标签。我试图让它回应未知如果该字段是空白但我尝试的每个if语句将无法正常工作。 id3标签是固定大小的,因此它们永远不会为空,但如果没有值,它们将填充空白区域。 I.E标题标签长度为30个字符。到目前为止,我已经尝试了

echo :$string: #outputs spaces between the 2 ::

if [ -z "$string" ] #because of white space will always evaluate to true

x=echo $string | tr -d ' '; if [ -z "$string" ];  #still计算结果为true但是回声:$ x:它是echos ::

脚本

#!bin/bash
echo "$# files";
while [ "$i" != "" ];
do
   TAG=`tail -c 128 "$i" | head -c 3`;
   if [ $TAG="TAG" ]
   then
      ID3[0]=`tail -c 125 "$1" | head -c 30`;
      ID3[1]=`tail -c 95 "$1" | head -c 30`;
      ID3[2]=`tail -c 65 "$1" | head -c 30`;
      ID3[3]=`tail -c 35 "$1" | head 4`;
      ID3[4]=`tail -c 31 "$i" | head -c 28`;
      for i in "${ID3[@]}"
      do
         if [ "$(echo $i)" ] #the if statement mentioned
         then
            echo "N/A";
         else
            echo ":$i:";
         fi
      done
   else
      echo "$i does not have a proper id3 tag";
   fi
   shift;
done

8 个答案:

答案 0 :(得分:27)

这些答案中的许多答案都比应有的要复杂得多,或者说它们的可读性要差得多。

[[ $string = *[[:space:]]* ]]  && echo "String contains whitespace"
[[ $string = *[![:space:]]* ]] && echo "String contains non-whitespace"

答案 1 :(得分:5)

您可以使用bash的正则表达式语法。

它要求您使用双方括号[[ ... ]],(通常更通用) 该变量不需要引用。正则表达式本身不得引用

for str in "         "  "abc      " "" ;do
    if [[ $str =~ ^\ +$ ]] ;then 
      echo -e "Has length, and contain only whitespace  \"$str\"" 
    else 
      echo -e "Is either null or contain non-whitespace \"$str\" "
    fi
done

输出

Has length, and contain only whitespace  "         "
Is either null or contain non-whitespace "abc      " 
Is either null or contain non-whitespace "" 

答案 2 :(得分:3)

非特定于bash的非bash变体:

case "$string" in
 *[!\ ]*) echo "known";;
 *) echo "unknown";;
esac

答案 3 :(得分:1)

启用扩展globs(shopt -s extglob):

if [ -n "${string##+([[:space:]])}" ]; then
    echo '$string has non-whitespace characters'
fi

答案 4 :(得分:1)

[[ -z `echo $string` ]]

反引号执行命令; bash行解析将制表符和换行符转换为空格并加入双空格。 echo命令重新发出此字符串,该字符串缩小为空字符串,以便[[]]进行最终测试。我认为这是通过以下内容的最短解决方案:

> VAR="$(echo -e " \n\t")"
> [[ -z  `echo $VAR` ]] ; echo $?
0
> VAR="$(echo -e " \na\t")"
> [[ -z  `echo $VAR` ]] ; echo $?
1
> VAR="$(echo -e "aaa bbb")"
> [[ -z  `echo $VAR` ]] ; echo $?
1
> VAR=
> [[ -z  `echo $VAR` ]] ; echo $?
0

答案 5 :(得分:0)

if [ "$(echo "$string" | tr -s ' ')" == " " ]; then
  echo "all white space"
fi

将所有重复的空格压缩到一个空格,并进行比较。

答案 6 :(得分:0)

这个检查零长度或SPACE或TAB

S="Something"
if [[ "x$S" == "x" || "x$S" == x*\ * || "x$S" == x*\    * ]] ;then
  echo "Is not OK"
else
  echo "Is OK"
fi

答案 7 :(得分:0)

分享一种不需要双括号[[]]的更便携的方法,同时尽可能保持简单。

检测仅包含空格或= null的字符串:

if [ -z "${string// }" ]; then <do something>; fi

在这种情况下将是:

${var// }

例如:

if [ -z "${string// }" ]; then echo "It's empty!"; fi

这是通过替换将所有空白全部替换为null。如果$ string仅包含空格,则-z测试的结果为TRUE。如果字符串中包含非空格字符,则方程式的计算结果为FALSE。

进一步介绍BASH(由于OP在BASH中询问了此问题),尽管可以这样做,但上面的示例不会捕获选项卡。这是BASH中更多可以正常工作或无法正常工作的示例。

假设搜索字符串中有一个标签。

这有效:

string=$(echo -e "\t"); if [ -z ${string// } ]; then echo "It's empty!"; fi

但是这些不是:

string=$(echo -e "\t"); if [ -z "${string// }" ]; then echo "It's empty!"; fi
string=$(echo -e "\t"); if [ -z '${string// }' ]; then echo "It's empty!"; fi

以上两个示例均报告字符串不为空。如果您认为制表符是空白,那将是一个问题,并且您想使用第一个示例。

换行怎么样?让我们看一下\n场景。首先,“正确”的行为取决于您的期望。

这些将换行符(\n)视为空格(等式为TRUE):

string=$(echo -e "\n\n"); if [ -z ${string// } ]; then echo "It's empty!"; fi
string=$(echo -e "\n\n"); if [ -z "${string// }" ]; then echo "It's empty!"; fi

不是(等式为FALSE),这意味着等式认为换行符不是空格。

string=$(echo -e "\n\n"); if [ -z '${string// }' ]; then echo "It's empty!"; fi

如果需要检查换行符,制表符和空格,则可能需要使用两个IF / THEN语句或上述的CASE方法。