首页 > 解决方案 > 调用带有参数“#”的 bash 命令

问题描述

考虑以下代码:

sqls='/mnt/c/alias/Binn/SQLCMD.EXE -b -S HostName -U Username -P MyPW# -d dbName'

dbName这是使用用户名连接到 SQL Server DB 的命令的Username前缀HostName

`$sqls -Q "select 1;"`

对其执行select 1语句并按预期工作。

$($sqls -Q "select 1;")

失败。为什么?是因为密码中的“#”吗?我应该如何更改上面的 sqls 行以使其与$(...)表达式一起使用?

标签: bashshell

解决方案


将命令存储在字符串中很容易失败。我们可以弄清楚为什么它不起作用,但更好的做法是使用一个函数:

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 上,所以不确定)来存储默认用户、通行证和数据库,使您能够运行查询而无需每次都传递所有这些选项。


推荐阅读