9

我有这个代码:

#!/bin/bash

input="./user.cvs"

while IFS=';' read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13
do

  path="./QRcodes/$f2$f3.png"

  vcard="BEGIN:VCARD%0AN;CHARSET=utf-8:$f3;$f2;;$f1;%0AADR;CHARSET=utf-8;INTL;PARCEL;WORK:;;$f10;$f11;;$f12;$f13%0AEMAIL;INTERNET:$f6%0AORG:$f4%0ATEL;WORK:$f8%0ATEL;FAX;WORK:$f9%0ATITLE:$f5%0AURL;WORK:$f7%0AEND:VCARD"

  latex=""

  encodedVCard=$(echo "$vcard" | sed -e 's/\+/\%2B/g')

  url="http://api.qrserver.com/v1/create-qr-code/?size=300x300&data=$encodedVCard"

  wget -O "$path" "$url"

  latex+="\n \\begin{tabular}{ C C } \\includegraphics[height=30mm]{graphic.png} & Name \\\\ \\end{tabular}"

  echo $latex

done < "$input"

除了 'echo $latex' 外,一切正常,总是打印同一行而不是多次。我错过了什么?

4

3 回答 3

19

如果要附加到字符串,只需

latex="$latex newstring"

或者

latex=${latex}newstring

您需要注意 bash 不会将上述内容解释为新的 var 例如"$a4" 将被解释为变量而a4不是附加的。$a4

于 2012-08-16T08:14:45.793 回答
4

几个问题:

  1. 反斜杠表达式在双引号内没有特殊处理,因此“\n”是两个字符,“\”和“n”,而不是单个换行符。使用 $'\n' 包含一个实际的换行符

  2. echo $latex扩展变量,但是 bash 对 . 中包含的任何空格latex(包括换行符)执行分词,因此echo. 您需要引用变量:echo "$latex"

  3. 正如其他人所指出的,您正在循环的每次迭代中重置变量。

把这一切放在一起,

input="./user.cvs"
latex=""

while IFS=';' read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13
do

  path="./QRcodes/$f2$f3.png"

  vcard="BEGIN:VCARD%0AN;CHARSET=utf-8:$f3;$f2;;$f1;%0AADR;CHARSET=utf-8;INTL;PARCEL;WORK:;;$f10;$f11;;$f12;$f13%0AEMAIL;INTERNET:$f6%0AORG:$f4%0ATEL;WORK:$f8%0ATEL;FAX;WORK:$f9%0ATITLE:$f5%0AURL;WORK:$f7%0AEND:VCARD"

  #encodedVCard=$(echo "$vcard" | sed -e 's/\+/\%2B/g')
  # You can use bash parameter expansion instead of piping into sed 
  encodedVCard="${vcard//+/%2B}"

  url="http://api.qrserver.com/v1/create-qr-code/?size=300x300&data=$encodedVCard"
  wget -O "$path" "$url"
  latex+=$'\n \\begin{tabular}{ C C } \\includegraphics[height=30mm]{graphic.png} & Name \\\\ \\end{tabular}'

  echo "$latex"

done < "$input"
于 2012-08-16T12:34:25.730 回答
2

你有

latex=""

在循环中,所以它每次都会重置它。把它放在循环开始之前。

于 2012-08-16T08:24:31.603 回答