考虑以下代码:
sqls='/mnt/c/alias/Binn/SQLCMD.EXE -b -S HostName -U Username -P MyPW# -d dbName'
这是在dbName
上以用户名Username
连接到SQL Server数据库HostName
的命令的前缀
`$sqls -Q "select 1;"`
对其执行select 1
语句,它可以按预期工作。
$($sqls -Q "select 1;")
失败。为什么?是因为密码中的“#”吗?我应该如何更改上面的sqls行,使其与$(...)
表达式一起使用?
答案 0 :(得分:3)
将命令存储在字符串中是prone to failure。我们可以弄清楚为什么它不起作用,但是更好的办法是使用一个函数:
sql() {
/mnt/c/alias/Binn/SQLCMD.EXE -b -S HostName -U Username -P 'MyPW#' -d dbName -Q "$1"
}
这允许引用密码,从而消除了可能破坏命令的可能性。
像sql 'select 1'
一样使用它。使用标准命令替换保存结果:
foo=$(sql 'select 1')
还请记住,您可以使用配置文件(可能是$HOME/.my.cnf
,但是看起来好像您在Windows上,所以不确定)可以存储默认用户,密码和数据库,从而使您无需运行查询即可每次都通过所有这些选项。