在bashrc的shell函数中转义awk $

时间:2013-08-08 09:51:46

标签: awk bash

我有一个命令从sql文件池中获取表的下一个ID,现在我试图使用shell函数将此命令作为别名放在〜/ .bashrc中,但我没弄明白要转义$以便它变为awk而不是被bash取代,这是.bashrc中的代码:

function nextval () {
    grep 'INSERT INTO \""$1"\"' *.sql | \
    awk '{print $6}' | \
    cut -c 2- | \
    awk -F "," '{print $1}' | \
    sort -n | \
    tail -n 1 | \
    awk '{print $0+1}'
}

alias nextval=nextval

用法:# nextval tablename

使用\$转义我收到错误:awk: backslash not last character on line$不在双引号内,为什么bash会替换它呢?

2 个答案:

答案 0 :(得分:5)

也许你真正需要改变的部分是这个

'INSERT INTO \""$1"\"'

"INSERT INTO \"$1\""

答案 1 :(得分:3)

@konsolebox回答了你的问题,但你也可以编写没有这么多工具和管道的函数,例如:

function nextval () {
    awk -v tbl="$1" '
        $0 ~ "INSERT INTO \"" tbl "\"" {
            split( substr($6,2), a, /,/ )
            val = ( ((val == "") || (a[1] > val)) ? a[1] : val)
        }
        END { print val+1 }
    ' *.sql
}

如果没有任何样本输入或预期输出进行测试,很难判断上述内容是否100%正确,但它应该接近。