如何逐行读取文件并将每行重定向到shell脚本中的变量?

时间:2015-12-22 09:19:23

标签: linux shell

我正在使用ksh shell。 我想使用这些变量并在调用时获取值(p1,p2,p3,p4)。文件test1.log可能包含任意数量的行,因此无法将其定义为p1 ... p4。脚本本身应该考虑行数并按顺序相应地分配变量。

请帮助解决这个问题。下面是我的输入文件test1.log

ABC
DEF
GHI
JKL    

我希望输出为

p1=ABC
p2=DEF
p3=GHI
p4=JKL    

4 个答案:

答案 0 :(得分:1)

您可以利用cat $ cat -n test1.log | perl -pe 's/^(\s*)(\d+)(\s*)/p$2=/' p1=ABC p2=DEF p3=GHI p4=JKL 选项来绘制行号。随后进行一些Perl替换,一个简单的解决方案是:

eval

如果您想在脚本中访问这些变量,我建议您按以下方式使用while read line; do eval "$line" ; done < <(cat -n tmp | perl -pe 's/^(\s*)(\d+)(\s*)/p$2="/; s/$/"/') echo p1 : $p1 echo p2 : $p2 命令:

$ cat test1.log
ABC foo
DEF
GHI
JKL

请注意,在第二个示例中,我通过添加双引号添加了对内部空间的行的支持。我使用以下输入文件:

while

直接从命令行,您当然可以运行export部分并获取shell中的p1,p2,....

如果要单独“加载”变量并在其他脚本中访问它们,可以使用while read line; do eval "$line" ; done < <(cat -n tmp | perl -pe 's/^(\s*)(\d+)(\s*)/export p$2="/; s/$/"/') 命令(我更喜欢在Perl替换部分中添加它):

$ cat tmp.sh
echo p1 : $p1
echo p2 : $p2
echo p3 : $p3
echo p4 : $p4

在shell中运行此命令后,可以使用像

这样的简单脚本
$ ./tmp.sh
p1 : ABC foo
p2 : DEF
p3 : GHI
p4 : JKL
然后

将输出

{{1}}

享受

答案 1 :(得分:0)

vars=`cat data.txt`

inc=0
for v in ${vars}
do
        inc=`expr $inc + 1`
        declare "param$inc=$v";
        localParam="param$inc"
        echo "${localParam}=${!localParam}";
done

答案 2 :(得分:0)

在ksh中,您可以像这样使用eval

cat $file |
  while read LINE 
  do  
    for out in $LINE  
    do  
      eval part$((++i))="$out" 
    done 
  done
echo "p1=$part1"
echo "p2=$part2"
echo "p1=$part3"
echo "p4=$part4"

我还将i++更改为++i,以便索引从1而不是0开始。

答案 3 :(得分:0)

如果您的输入数据确实不包含任何空格字符,则可以使用

执行此操作
grep -v '^$' YOURFILE | nl -s= -w99 | tr -s ' ' p