1

我有一个从 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 替换它呢?

4

2 回答 2

5

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

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

"INSERT INTO \"$1\""
于 2013-08-08T10:00:42.497 回答
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% 正确,但它应该是接近的。

于 2013-08-08T11:11:50.693 回答