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 

Solutions Collecting From Web of "Bash脚本来读取文件"

循环执行一次。

  • 它将"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 

Bash可以为你做所有的工作。 没有必要cut

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

将行读入数组,然后将数组视为标量,从而为您提供第一个元素。 然后echo的大括号扩展去掉引号。

或者你可以让cut做所有的工作,并给Bash一个长时间的休息时间:

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

总是引用包含文件名的变量。

乔纳森·莱弗勒(Jonathan Leffler)给了你一个更简单的方法(这也会更有效),但是如果这是对你将要扩展的东西的简化(只是调用剪切不会做你想要的)原则无论如何,您的代码将需要被修正,以每行显示为标准输入,如下所示:

 #!/bin/bash FILENAME=$1 while read line do echo $line | cut -d '"' -f2 done < $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