Bash函数调用错误
Bash function call error
我在 Bash 函数传递参数时需要一些帮助。我需要将参数传递给 Bash 中的 SQL 查询,但我收到错误消息。
#!/bin/bash --
whw='mysql -uroot -proot -habczx.net'
function foo() {
for v in "$@"; do
eval "$v"; # line 9
echo "${v}";
done
${whw} -e"select id, idCfg, idMfg, $DATE from tblMfg"
}
foo DATE="curdate()"
下面是我收到的错误信息:
$ sh test4.sh
test4.sh: eval: line 9: syntax error near unexpected token `('
test4.sh: eval: line 9: `DATE=curdate()'
test4.sh: line 9: warning: syntax errors in . or eval will cause future versions of the shell to abort as Posix requires
DATE=curdate()
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from tblMfg limit 4' at line 1
==
如果我将函数调用更改为以下,我不会收到任何错误消息:
foo DATE="2014-12-21"
==
有什么帮助吗?
谢谢!
问题是求值表达式。您可以通过输入它来查看:
$ DATE=bla()
-bash: syntax error near unexpected token `('
如果你把它放在引号里,它会起作用:
$ DATE="bla()"
为了将引号传递给评估,需要保护它们免于在调用站点进行评估:
foo 'DATE="curdate()"'
应该可以解决问题。
顺便说一句:评估字符串是相当危险的,特别是如果参数来自不受信任的用户,可以使用 foo "rm -rf /"
:)
我不确定你为什么需要评估,而不是 $DATE 你也可以使用 $1 然后
${whw} -e"SELECT ... ...."
foo "curdate()"
我在 Bash 函数传递参数时需要一些帮助。我需要将参数传递给 Bash 中的 SQL 查询,但我收到错误消息。
#!/bin/bash --
whw='mysql -uroot -proot -habczx.net'
function foo() {
for v in "$@"; do
eval "$v"; # line 9
echo "${v}";
done
${whw} -e"select id, idCfg, idMfg, $DATE from tblMfg"
}
foo DATE="curdate()"
下面是我收到的错误信息:
$ sh test4.sh
test4.sh: eval: line 9: syntax error near unexpected token `('
test4.sh: eval: line 9: `DATE=curdate()'
test4.sh: line 9: warning: syntax errors in . or eval will cause future versions of the shell to abort as Posix requires
DATE=curdate()
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from tblMfg limit 4' at line 1
==
如果我将函数调用更改为以下,我不会收到任何错误消息:
foo DATE="2014-12-21"
==
有什么帮助吗?
谢谢!
问题是求值表达式。您可以通过输入它来查看:
$ DATE=bla()
-bash: syntax error near unexpected token `('
如果你把它放在引号里,它会起作用:
$ DATE="bla()"
为了将引号传递给评估,需要保护它们免于在调用站点进行评估:
foo 'DATE="curdate()"'
应该可以解决问题。
顺便说一句:评估字符串是相当危险的,特别是如果参数来自不受信任的用户,可以使用 foo "rm -rf /"
:)
我不确定你为什么需要评估,而不是 $DATE 你也可以使用 $1 然后
${whw} -e"SELECT ... ...."
foo "curdate()"