不确定为什么最后一行没有将双引号从脚本中删除:
#!/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
循环只执行一次。
"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
#!/bin/bash
FILENAME=$1
while read -r -a line
do
echo ${line//\"}
done < "$FILENAME"
这段代码将一行读入一个数组,然后将该数组视为标量,从而获得第一个元素。然后在echo
中的花括号扩展中去掉引号。
或者你可以让cut
完成所有工作,让Bash休息一会儿:
FILENAME=$1
cut -d '"' -f2 "$FILENAME"
始终引用包含文件名的变量。
#!/bin/bash
FILENAME=$1
while read line
do
echo $line | cut -d '"' -f2
done < $FILENAME
就像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