【问题标题】:Escape awk $ in shell function of bashrc在 bashrc 的 shell 函数中转义 awk $
【发布时间】:2013-08-08 19:11:50
【问题描述】:

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

【问题讨论】:

  • 你不会在grep 命令中混淆单引号和双引号吗?我不明白你为什么用双引号而不是单引号包围 $1
  • 行尾的管道符号 (|) 后不需要转义符 (\ )。

标签: awk bash


【解决方案1】:

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

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

"INSERT INTO \"$1\""

【讨论】:

  • 接受,即使我喜欢@ed-morton 的 awk 解决方案,只是因为这解决了问题中的代码。
【解决方案2】:

@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% 正确,但应该很接近。

【讨论】:

  • +1 对于这个解决方案,它按预期工作。顺便说一句,我期待批评使用这么多工具(即使他们完成工作),因为我不是 awk 专家:),谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多