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