我的脚本正在阅读并显示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
答案 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方法。