如何在bash中识别\ n

时间:2011-11-08 15:08:23

标签: mysql bash escaping quoting

有这样的剧本:

#! /bin/bash

typeset -i i END
let END=500 i=1
remainder=1
accum="use yola_test;\n"
for ((i=1;i<=END;++i)); do 
#   str1=$( echo "$i" | md5sum | md5sum )
    title="title_$i"
#   "${str1:2:20}"
    accum="${accum}CALL add_new_enterprise(\"$title\");\n"
    let "remainder=$i % 100"
    if [ $remainder -eq 0 ]; then
        accum="${accum}SELECT count(*) as \`enterprises:\` FROM enterprise;\n"
        mysql --host=l --port=0 --user=r --password='!' --execute="$accum" 
        accum="use yola_test;\n"
    fi
done

但是对于每一个\ n它给我“寻呼机设置为stdout”,我可以避免这种情况,我知道当它回应时我必须使用-e选项,但我读了一些关于ANSI-C引用的材料,但是没有其他例子如何使用它。

我试过这样做

mysql --host=l --port=0 --user=r --password='!' --execute="$( echo -e "$accum" )"

但它没有效果,我认为调用echo会增加运行时间。

2 个答案:

答案 0 :(得分:3)

@ pgl的答案是这种情况的最佳方法,但如果你确实需要在一个变量值中嵌入换行符,最简单的方法就是使用bash的$'...'引用形式:

accum=$'use yola_test;\n'
...
accum="${accum}CALL add_new_enterprise(\"$title\");"$'\n'
...etc

请注意,上面的第二个示例使用了多种引用类型;第一部分的双引号允许变量插值,然后$'...'表示需要转义序列解释的部分。

BTW,另一种方法是定义一个变量来保存换行符:

nl=$'\n'
accum="use yola_test;${nl}"
...
accum="${accum}CALL add_new_enterprise(\"$title\");${nl}"
...etc

答案 1 :(得分:2)

“PAGER设置为stdout”来自MySQL - 要停止显示,只需从代码中删除\ n的实例;你不需要它们。