bash脚本读取文件

问题描述:

不知道为什么最后一行不从脚本切“: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