簡體   English   中英

如何逐行讀取文件並將每行重定向到Shell腳本中的變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM