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" の 2 文字であり、単一の改行ではありません。$'\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 に答える