繁体   English   中英

Bash脚本来读取文件

[英]Bash script to read a file

不知道为什么最后一行没有削减“从脚本:

#!/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

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为您提供了一个更简单的方法(也会更高效),但是如果这是对您要扩展的东西的简化(只是调用cut会不会做你想要的),并且只是为了演示无论如何,你需要修改你的代码,以便将每一行显式地提供给stdin,如下所示:

#!/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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM