我正在使用ksh shell。 我想使用这些变量并在调用时获取值(p1,p2,p3,p4)。文件test1.log可能包含任意数量的行,因此无法将其定义为p1 ... p4。脚本本身应该考虑行数并按顺序相应地分配变量。
请帮助解决这个问题。下面是我的输入文件test1.log
ABC
DEF
GHI
JKL
我希望输出为
p1=ABC
p2=DEF
p3=GHI
p4=JKL
答案 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