2010-07-16 163 views
2

不知道爲什麼最後一行不從腳本切「:bash腳本讀取文件

#!/bin/bash 

FILENAME=$1 
while read line 
do 
cut -d '"' -f2 
echo $line 
done < $FILENAME 

$ cat file 

"1" test 
"2" test 
"3" test 
"4" test 
"5" test 

如果我運行此腳本使用下面的命令:

$ ./test file 

2 
3 
4 
5 
"1" test 

回答

6

環路執行一次。

  • 它讀取成可變$line
  • 它執行cut -d '"' -f2,它讀取文件的第2-5行(因爲這是當時的標準輸入)並打印該數字。
  • 它與第一行中的內容相呼應。

修復:

cut -d '"' -f2 $FILENAME 

如果,另一方面,你想要得到的數字到一個變量,你可以通過多種方式做到這一點,包括:

cut -d '"' -f2 $FILENAME | 
while read number 
do # What you want 
    echo $number 
done 

或:

while read line 
do 
    number=$(echo "$line" | cut -d '"' -f2) 
    echo $number 
done 
0

喬納森·萊弗勒的給你一個簡單的方法(將人所以要更高效),但如果這是對你要擴展的東西的簡化(只是調用cut不會做你想做的事情),並且只是爲了演示原則,你的代碼需要是按照以下步驟明確地向stdin饋送每條線:

#!/bin/bash 

FILENAME=$1 
while read line 
do 
    echo $line | cut -d '"' -f2 
done < $FILENAME 
2

Bash可以爲你做所有的工作。有沒有必要爲cut

#!/bin/bash 

FILENAME=$1 
while read -r -a line 
do 
    echo ${line//\"} 
done < "$FILENAME" 

行讀取到一個數組,然後把數組作爲一個標量,它給你的第一要素。然後在echo中的大括號擴展去掉引號。

或者你也可以讓cut完成所有的工作,並給予猛砸長的休息時間:

FILENAME=$1 
cut -d '"' -f2 "$FILENAME" 

時常引用包含文件名的變量。

0

像丹尼斯提到,有沒有必要使用外部命令

$ while read -r line; do set -- $line; echo ${1//\"/}; done<file 
1 
2 
3 
4 
5 

但外部命令,如果你有非常大的文件運行速度更快。

$ cut -d'"' -f2 file 
1 
2 
3 
4 
5 
$ awk -F'"' '{print $2}' file 
1 
2 
3 
4 
5 
$ sed 's/^"//;s/".*//' file 
1 
2 
3 
4 
5