2012-03-19 80 views
14

我的腳本正在讀取和顯示id3標籤。我試圖讓它回聲未知,如果該字段是空白,但每個如果我嘗試的聲明不會工作。 id3標籤是一個固定的大小,所以它們永遠不會爲空,但如果沒有任何值,它們將被填充空白區域。 I.E標題標籤的長度爲30個字符。到目前爲止,我已經試過測試字符串在Bash中是否有非空白字符

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計算結果爲真實的,但回聲:$ X:它的回聲::

腳本

#!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

'-z「$ x」'當然? – 2012-03-19 09:37:43

+0

Michal Politowski:'-z' \t表示操作數的長度爲零 – 2012-03-19 10:03:43

+0

@ Peter.O:是的,$ x是應該測試的字符串,而不是$ string。 – ams 2012-03-19 10:10:38

回答

4

你可以使用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 "" 
+0

一切都回蕩所有的空格 – Yamiko 2012-03-19 10:16:47

+0

謝謝yamikoWebs ...我開始使用正則表達式,然後選擇globbing ...我已經恢復到正則表達式......編輯使用bash的正則表達式的答案。 – 2012-03-19 11:04:38

+0

正如目前所寫,這隻會檢查空格,而不是所有空格字符 - 它不處理製表符或換行符等等。 – 2013-06-25 00:04:23

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

那將所有重複的空間壓縮到一個空間,並進行比較。

+0

Im遍歷所有標記,而不是全部是30個字符還有另一種方法來測試一個字符串是否都是空格? – Yamiko 2012-03-19 09:33:02

+0

標籤之間是否有空格之間的空格? – ams 2012-03-19 09:34:05

+0

是的。如果一個標籤是10個字符,則其餘部分填充空格。 – Yamiko 2012-03-19 09:34:46

3

一個非特定的bash,外殼僅變種:

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

這給出了語法錯誤。 – ams 2012-03-19 12:04:11

+0

是的,空間應該已經逃脫。 – 2012-03-19 12:26:30

+3

更好地使用POSIX字符類'[[:space:]]'而不是專門列出'\'。 – 2013-06-25 00:03:15

1

通過擴展水珠啓用(shopt -s extglob):

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

它出來太多的參數和二元運算符預計 – Yamiko 2012-03-19 10:12:17

+0

@yamikoWebs你需要引用變量(見更新) – 2012-03-19 10:16:52

+0

他們都回聲包括我懷疑有空間的。有沒有一種方法可以驗證它們是空間而不是別的? – Yamiko 2012-03-19 10:23:05

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 
26

其中許多答案比他們應該的要複雜得多,或者說可讀性要差得多。

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

肯定是最好的Bash答案!感謝傳播良好做法。 – 2013-11-03 17:55:41

+0

雖然這並不回答問題。 OP的問題是如何測試一個字符串是否至少包含一個非空白字符。這是一個包含至少一個空格的字符串的測試。 – kkm 2015-08-19 00:51:42

+0

@kkm,我很尷尬,錯誤倖存了這麼久。解決。 – 2015-08-19 01:31:11

0
[[ -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 
相關問題