【问题标题】:How do I pass arguments containing special characters to a bash script? [duplicate]如何将包含特殊字符的参数传递给 bash 脚本? [复制]
【发布时间】:2021-09-17 13:47:41
【问题描述】:

通常我可以在我的服务器中以以下方式通过命令行运行命令来运行 sql 脚本:

[ec2-user@ip-XX-XX-XX-XXX ~]$ sudo mysql -h BLAHBLAHBLAH.us-east-1.rds.amazonaws.com -u user -p'aaaaa:b>c[d{e]ff=|ggggggggg^$*' adi_chf_db < ./test.sql

所以我想让这个简单,并让一个 bash 脚本为我运行它:

#!/bin/bash

sql_cmd_to_run="sudo mysql -h BLAHBLAHBLAH.us-east-1.rds.amazonaws.com -u user -p\'aaaaa:b>c[d{e]ff=|ggggggggg^$*\' test_database < ./test.sql"
ssh -t test_server "${sql_cmd_to_run}"

我的结果如下:

bash: ggggggggg^': command not found
ERROR 1045 (28000): Access denied for user 'user'@'XX.XX.XX.XXX' (using password: YES)
Connection to XX.XX.XX.XXX closed.

我也知道 bash 中有一些特殊字符,所以我也尝试了以下方法(通过将 \ 放在特殊字符之前):

#!/bin/bash

sql_cmd_to_run="sudo mysql -h BLAHBLAHBLAH.us-east-1.rds.amazonaws.com -u user -p\'aaaaa:b\>c\[d\{e\]ff=\|ggggggggg\^$\*\' test_database < ./test.sql"
ssh -t test_server "${sql_cmd_to_run}"

输出是什么:

ERROR 1045 (28000): Access denied for user 'user'@'XX.XX.XX.XXX' (using password: YES)
Connection to XX.XX.XX.XXX closed.

(显然出于某些安全原因,我隐藏了一些值。)

【问题讨论】:

  • 请不要标记垃圾邮件。它将您的问题插入到不属于它的搜索结果中。

标签: bash special-characters


【解决方案1】:

不要尝试手动进行 shell 引用:让 shell 为你做。

所以,如果你有一个有效的本地命令:

sudo mysql -h BLAHBLAHBLAH.us-east-1.rds.amazonaws.com -u user -p'aaaaa:b>c[d{e]ff=|ggggggggg^$*' adi_chf_db < ./test.sql

...然后将其封装在一个函数中,方法是在前面添加 mycmd() { 行,在后面添加 } 行:

mycmd() {
  sudo mysql -h BLAHBLAHBLAH.us-east-1.rds.amazonaws.com -u user -p'aaaaa:b>c[d{e]ff=|ggggggggg^$*' adi_chf_db < ./test.sql
}

...并告诉 shell 将该函数序列化到您的 ssh 会话中:

ssh test_server "$(declare -f mycmd); mycmd"

【讨论】:

  • 嘿,这是一个巧妙的技巧:),它节省了我处理那些讨厌的特殊字符的时间哈哈。
猜你喜欢
  • 2012-12-02
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多