4

さて、ユーザーとパスワードのCSVファイルがあります。パスワードにバックスラッシュが含まれていることがあります。このファイルをループしてユーザーとパスワードを別のスクリプトに渡す必要がありますが、bashにバックスラッシュを取得させる方法がわかりません。リテラル文字として。

csv:

jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv 
user3@domain.com,bzfbx6bkuu\Mpull
user2@domain.com,Hppk8mll\kffbsfd
user1@domain.com,w1fgfqbjlhLjnni\

Sedはバックスラッシュを拡張していません-これは良いことです:

jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv | sed "s/,/\t/" 
user3@domain.com        bzfbx6bkuu\Mpull
user2@domain.com        Hppk8mll\kffbsfd
user1@domain.com        w1fgfqbjlhLjnni\

それらを変数に読み込もうとすると、バックスラッシュがメタ文字になります。ご覧のとおり、文字をエスケープし、最後の行が最後にあるため、戻り文字をエスケープします。

jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv | sed "s/,/\t/" | while read user pass; do echo "${user},${pass}"; done
user3@domain.com,bzfbx6bkuuMpull
user2@domain.com,Hppk8mllkffbsfd

最初に円記号をエスケープしようとしても機能しません。

jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv | sed "s/,/\t/" | sed "s/\\\/\\\\/g" | while read user pass; do echo "${user},${pass}"; done
user3@domain.com,bzfbx6bkuuMpull
user2@domain.com,Hppk8mllkffbsfd
jgalley@hoth1mig:~/logs/zimbraShares$ 

最終的な目標は、次のようなことです。

head test.csv | sed "s/,/\t/g" | while read auser apass;
do 
  echo -n "${auser},${apass}"
  bash -c  "/home/jgalley/scripts/someScript.php -u '${auser}' -p '${apass}' -d '${auser}'";      
done
4

1 に答える 1

7

-r次のオプションを使用しますread

while read -r auser apass;

-rが指定されている場合\、はエスケープ文字とは見なされません。

于 2012-12-31T17:47:38.393 に答える