我正在学习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如何运作?
答案 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
的新行分隔符,但您仍然需要更改输入格式以反映您的选择。