不确定为什么最后一行没有从剧本中删除“
#!/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
答案 0 :(得分:6)
循环执行一次。
"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
答案 1 :(得分: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"
始终引用包含文件名的变量。
答案 2 :(得分:0)
Jonathan Leffler给你一个更简单的方法(也会更有效率),但是如果这是对你要扩展的东西的简化(只是调用cut会不会做你想要的),并且为了证明这个原理,你的代码需要修复,以便明确地将每一行提供给stdin,如下所示:
#!/bin/bash
FILENAME=$1
while read line
do
echo $line | cut -d '"' -f2
done < $FILENAME
答案 3 :(得分:0)
$ 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