Bash脚本读取文件

3

不确定为什么最后一行没有将双引号从脚本中删除:

#!/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
4个回答

7

循环只执行一次。

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

2
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"

始终引用包含文件名的变量。


0
Jonathan Leffler给出了一个更简单的方法(也更有效率),但是如果这只是你将要扩展的某个东西的简化版(在那里仅仅调用cut不会做你想要的事情),为了演示原则,你的代码需要修复以显式地将每一行馈送到stdin中,如下所示:
#!/bin/bash

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

0

就像Dennis提到的那样,没有必要使用外部命令

$ 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接