2010-04-05 268 views
22

我有一個shell腳本是這樣的:如何測試shell腳本中的行是否爲空?

cat file | while read line 
do 
    # run some commands using $line  
done 

現在我需要檢查,如果行中包含任何非空白字符([\ n \ T]),如果不是,跳過它。 我該怎麼做?

回答

50

由於read讀取由默認空格分隔的字段,只含有空格應該導致空字符串的一行被分配到變量,所以你應該能夠跳過空行只:

[ -z "$line" ] && continue 
+4

(更準確地說,'read'使用的分隔符由'IFS'變量決定,默認爲空白,只需將'IFS'恢復爲空白即可)。 – Arkku 2010-04-05 12:23:03

+0

所有優點都很簡單:) – planetp 2010-04-05 12:41:00

+1

更簡單:無需要引用行,如果你使用bash的[[syntax:'[[-z $ line]] && continue' – pihentagy 2013-10-10 16:08:24

4

慶典:

if [[ ! $line =~ [^[:space:]] ]] ; then 
    continue 
fi 

而且使用done < file代替cat file | while,除非你知道你爲什麼會用後者。

+0

我需要的不便,將在這兩個bash和sh的工作。有什麼解決方案使用sh/sed/tr(如果沒有安裝bash)? – planetp 2010-04-05 11:41:19

2
if ! grep -q '[^[:space:]]' ; then 
    continue 
fi 
1

cat我在這種情況下無用,如果您在讀取循環時使用。我不確定你的意思是你想跳過空行還是跳過至少包含空格的行。

i=0 
while read -r line 
do 
    ((i++)) # or $(echo $i+1|bc) with sh 
    case "$line" in 
    "") echo "blank line at line: $i ";; 
    *" "*) echo "line with blanks at $i";; 
    *[[:blank:]]*) echo "line with blanks at $i";; 
    esac 
done <"file" 
7

試試這個

while read line; 
do 

    if [ "$line" != "" ]; then 
     # Do something here 
    fi 

done < $SOURCE_FILE 
+4

請添加一些解釋,而不僅僅是代碼。 – 2012-10-16 18:29:50

+0

有關方括號表示法的更多信息,請參見[測試手冊頁](http://man.cx/test) – c0dem4gnetic 2012-10-16 18:35:33