[英]How can I read a file line by line and redirect each line to a variable in shell scripting?
我正在使用ksh shell。 我想使用這些變量並在調用(p1,p2,p3,p4)時獲取值。 文件test1.log可以包含任意行,因此不能將其定義為p1 ... p4。 腳本本身應考慮行數,並相應地按順序分配變量。
請幫忙。 下面是我的輸入文件test1.log
ABC
DEF
GHI
JKL
我希望我的輸出為
p1=ABC
p2=DEF
p3=GHI
p4=JKL
您可以利用cat
的-n
選項來繪制行號。 之后進行一些Perl替換,一個簡單的解決方案是:
$ cat -n test1.log | perl -pe 's/^(\s*)(\d+)(\s*)/p$2=/'
p1=ABC
p2=DEF
p3=GHI
p4=JKL
如果要在腳本中訪問這些變量,建議您通過以下方式使用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
部分,並在外殼中獲取p1,p2,...。
如果要單獨“加載”變量並在其他腳本中訪問它們,則可以使用export
命令(我更喜歡在Perl替換部分中添加它):
while read line; do eval "$line" ; done < <(cat -n tmp | perl -pe 's/^(\s*)(\d+)(\s*)/export p$2="/; s/$/"/')
在外殼中運行此命令后,將出現一個簡單的腳本,例如
$ cat tmp.sh
echo p1 : $p1
echo p2 : $p2
echo p3 : $p3
echo p4 : $p4
然后將輸出
$ ./tmp.sh
p1 : ABC foo
p2 : DEF
p3 : GHI
p4 : JKL
請享用
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
在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開始。
如果您的輸入數據確實不包含任何空格字符,則可以使用
grep -v '^$' YOURFILE | nl -s= -w99 | tr -s ' ' p
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.