我有一个命令从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会替换它呢?
答案 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%正确,但它应该接近。