IFS在bash脚本中

时间:2018-02-10 13:00:34

标签: linux bash shell unix ifs

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

考虑以下文件。 mem.txt

void read_email_interactive(Email* email) {
printf("Subject: ");
fgets(email->subject,DEFAULT_MAX_FIELD,stdin);

printf("From: ");
fgets(email->from,DEFAULT_MAX_FIELD,stdin);

printf("To: ");
fgets(email->to,DEFAULT_MAX_FIELD,stdin);

printf("Body: ");
fgets(email->body,MAX_BODY,stdin);

printf("ID: ");
fgets(email->id,DEFAULT_MAX_FIELD,stdin);

还有下面的shell脚本

i6

16GB

10T

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

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

为什么它没有显示每行的每个条目,如CPU:i6; MEM:16GB;磁盘:10T,因为IFS接受换行分隔符作为条目?请解释IFS如何运作?

1 个答案:

答案 0 :(得分:0)

正如评论中所述,阅读适用于一行输入。因此,对于文件的每一行,您都需要重新调用。如果输入格式是固定的,你仍然需要这样做,你可以使用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的新行分隔符,但您仍然需要更改输入格式以反映您的选择。