不知道爲什麼最後一行不從腳本切「: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
不知道爲什麼最後一行不從腳本切「: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
環路執行一次。
$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
喬納森·萊弗勒的給你一個簡單的方法(將人所以要更高效),但如果這是對你要擴展的東西的簡化(只是調用cut不會做你想做的事情),並且只是爲了演示原則,你的代碼需要是按照以下步驟明確地向stdin饋送每條線:
#!/bin/bash
FILENAME=$1
while read line
do
echo $line | cut -d '"' -f2
done < $FILENAME
Bash可以爲你做所有的工作。有沒有必要爲cut
:
#!/bin/bash
FILENAME=$1
while read -r -a line
do
echo ${line//\"}
done < "$FILENAME"
行讀取到一個數組,然後把數組作爲一個標量,它給你的第一要素。然後在echo
中的大括號擴展去掉引號。
或者你也可以讓cut
完成所有的工作,並給予猛砸長的休息時間:
FILENAME=$1
cut -d '"' -f2 "$FILENAME"
時常引用包含文件名的變量。
像丹尼斯提到,有沒有必要使用外部命令
$ 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