将包含反斜杠的字符串读入bash中的变量

时间:2012-12-31 17:42:22

标签: bash sed awk

好的,我有一个用户和密码的CSV文件,密码有时包含反斜杠,我需要循环遍历此文件并将用户和密码传递给另一个脚本,但我无法弄清楚如何make 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\

尝试将它们读入变量会导致反斜杠成为元字符,正如您所看到的,它会转义字符,并导致最后一行转义返回字符,因为它在最后:<\ n / p>

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

1 个答案:

答案 0 :(得分:6)

使用-r的{​​{1}}选项:

read

如果给出while read -r auser apass; -r将不会被视为转义字符。