迭代shell变量中的每一行

时间:2015-09-13 10:22:09

标签: linux shell

我有一个包含sql结果的shell变量。

echo "$sql"
SYSTEM            1000     40.625    /u01/oracle/datafile1.dbf
SYSAUX            1000    67.2375    /u02/oracle/datafile2.dbf
USERS               55 96.3636364    /u03/oracle/datafile3.dbf
UNDOTBS1          1000    98.0625    /u04/oracle/datafile4.dbf

我想为每一行应用相同的处理逻辑。 为此,我需要输出

1st Iteration
a=SYSTEM          b=1000     c=40.625    d=/u01/oracle/datafile1.dbf
2nd Iteration
 a= SYSTEM        b=1000     c=67.2375   d=/u01/oracle/datafile2.dbf
3rd Iteration
 a= SYSTEM        b=55     c=96.3636364    d=/u01/oracle/datafile3.dbf
4th Iteration
 a= SYSTEM        b=1000     c=98.0625     d=/u01/oracle/datafile4.dbf

注意:

  1. a,b,c,d是将用于进一步处理的变量。
  2. 迭代次数取决于$ sql的内容。

1 个答案:

答案 0 :(得分:1)

这可以在shell中使用readset内置函数完成:

#!/bin/sh

sql="SYSTEM            1000     40.625    /u01/oracle/datafile1.dbf
SYSAUX            1000    67.2375    /u02/oracle/datafile2.dbf
USERS               55 96.3636364    /u03/oracle/datafile3.dbf
UNDOTBS1          1000    98.0625    /u04/oracle/datafile4.dbf"

echo "$sql" |
while read line; do
   set -- $line
   a=$1 b=$2 c=$3 d=$4
   # Do something with a,b,c,d (or just use $1, $2, $3, $4.)
   echo "$1 $2 $3 $4"
done

请注意,只要单词不包含像' *'这样的shell glob字符,就可以正常工作。 (尝试使用四个* * * *)。如果您需要健壮,则应在$line之前验证set的内容。您可能还希望使用set -f禁用文件名扩展。