包装mysql -e" cmd"不起作用

时间:2018-04-24 14:48:38

标签: bash

我试图将这种命令mysql -e "SHOW TABLES;"包装到函数中。

我尝试的命令是

mysql -hremote_id -uuser -ppass db -e "SHOW TABLES;"

显然这可以按预期工作。但由于某些原因我不明白,这会显示帮助输出:

run ()
{
    local cmd=$1;
    shift;
    ${cmd} $@
}

run mysql "-hremote_id -uuser -ppass db -e \"SHOW TABLES;\""
run mysql '-hremote_id -uuser -ppass db -e ""SHOW TABLES;"'

最后两行都显示帮助页面:

mysql  Ver 14.14 Distrib 5.5.57, for Linux (x86_64) using readline 5.2
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

如何让它发挥作用?

1 个答案:

答案 0 :(得分:2)

run中使用更多引号:

run () {
  local cmd="$1"
  shift
  "$cmd" "$@"
}

并单独传递参数:

run mysql -hremote_id -uuser -ppass db -e "SHOW TABLES;"

你可能会看一下并问问自己"为什么我需要run?"这是一个非常好的问题。我假设run做的不仅仅是运行给定的命令。但是校长认为:个别论据应该保持个别论点。否则,您需要使用eval,这需要完全正确且安全地使用其他级别的护理。

如果您手动将参数打包成字符串,请停止这样做。使用数组:

opts=(-hremote_id -uuser -ppass db -e "Show TABLES;")
run mysql "${opts[@]}"

如果你从其他地方收到这个单一的字符串,那么你需要做一些重要的重新设计。