【问题标题】:IFS in bash scriptingbash 脚本中的 IFS
【发布时间】:2018-02-10 13:00:33
【问题描述】:

我正在学习 Bash 脚本中的 IFS。我无法理解 IFS 的概念。

考虑以下文件。内存.txt

i6

16GB

10T

还有下面的shell脚本来

#!/bin/bash
echo "File pls"
read file
while read -r CPU MEM DISK; do
        echo "CPU : $CPU"
        echo "MEM : $MEM"
        echo "DISK: $DISK"
done<"$file"

I Read that,shell将IFS设置为空格、制表符、换行符。所以当我运行脚本时,

File pls
mem.txt
CPU : i6
MEM : 
DISK: 
CPU : 4hz
MEM : 
DISK: 
CPU : 16GB
MEM : 
DISK: 
CPU : 10TB
MEM : 
DISK: 

为什么没有显示每行的每个条目,例如 CPU :i6 ;内存:16GB;磁盘:10T,因为 IFS 接受换行符作为条目?请解释 IFS 的工作原理?

【问题讨论】:

  • Bash read 内置一次读取一行。参见例如wiki.bash-hackers.org/commands/builtin/read
  • 你从哪里得到 4hz?您正在逐行阅读文件。在每一行上,期望是 3 个变量,但输入文件中只有一个变量...

标签: linux bash shell unix ifs


【解决方案1】:

正如 cmets 中所指出的,read 对一行输入起作用。因此,对于文件的每一行,您都调用 read anew。如果输入格式是固定的 a 并且您仍然需要这样做,例如,您可以使用 sed(如果可以到达外部 bash)将每六行分组为一行输入(见下面的注释)像这样:

while read -r CPU MEM DISK; do
   ...
done < <(sed -ne 'N;N;N;N;s/\n/ /gp;n' "$file")

这会将五行输入读入模式空间,用空格替换换行符,打印结果并丢弃以下输入行。冲洗并重复。

您还可以在有输入行时运行多次读取:

#!/bin/bash
echo "File pls"
read file
while { read CPU ; read blank;
        read MEM ; read blank;
        read DISK; }; do
          echo "CPU : $CPU"
          echo "MEM : $MEM"
          echo "DISK: $DISK"
          read blank  #placed it here so that file can but does not have to end
                      #with double trailing newline.
done <$file

不用说,这两个选项看起来都不是特别吸引人,也许考虑不同的格式输入或非 bash 解析会是更好的选择。


请注意,您可以将 read 的新行分隔符更改为 -d,但您仍需要更改输入格式以反映您的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 2022-11-10
    • 2011-11-04
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多