![使用命令行变量创建命令(带单引号),然后执行它](https://linux22.com/image/223329/%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%98%E9%87%8F%E5%88%9B%E5%BB%BA%E5%91%BD%E4%BB%A4%EF%BC%88%E5%B8%A6%E5%8D%95%E5%BC%95%E5%8F%B7%EF%BC%89%EF%BC%8C%E7%84%B6%E5%90%8E%E6%89%A7%E8%A1%8C%E5%AE%83.png)
我很抱歉我的第一个请求没有更清楚。
我一直在努力尝试获取一个非常简单的 bash 脚本命令来处理,但我被单引号字符搞砸了。我的目的是创建一个 shell 脚本,它从命令行接受一个变量(子网表示法),然后执行一个命令,该命令将使用某些特定语法(包括单引号,这让我很困惑)运行firewall-cmd命令,然后重新加载防火墙规则。我正在使用 printf 创建正确的脚本,但我无法弄清楚如何执行该文本字符串/行而不在输出中获取“”字符,并且尝试使用我想要的字符串创建一个变量也会把事情搞砸。
因此,我希望能够输入“./banish.sh 1.22.228.0/24”,它将执行 printf 生成的命令,然后重新加载防火墙规则。
我当前的代码:
#! /bin/bash
printf "firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=$1 drop'\n"
firewall-cmd --reload
我意识到“printf”命令实际上只是将该文本回显到屏幕上而不是执行它(就像“firewall-cmd --reload”行一样,但是如果我尝试将 printf 的输出分配给变量,然后开始将所有反斜杠放入其中。
有什么想法吗? TIA
答案1
感谢大家的帮助。底线是,我是:
- 想太多了,并且
- 我以为我必须在执行的字符串中使用单引号,但实际上双引号是有效的。
我很确定问题在于尝试在命令中正确包含单引号。我最终得到的有效的结果是:
#! /bin/bash
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=$1 drop"
firewall-cmd --reload
所以现在当我运行脚本时,一切正常。感谢您对这本应该是一件微不足道的事情的支持。
答案2
您可以使用数组变量来构造参数中带有空格的大命令。
它读起来很漂亮,接受动态构造,为参数准备好空格,并且比eval
命令更安全。
打印命令也很有趣。
#! /usr/bin/env bash
# One array item ("...") per parameter
declare -a fw_cmd_1=(
"firewall-cmd"
"--permanent"
"--add-rich-rule='rule family=ipv4 source address=$1 drop'"
)
declare -a fw_cmd_2=(
"firewall-cmd"
"--reload"
)
printf "Command 1: %s\n" "${fw_cmd_1[*]}"
"${fw_cmd_1[@]}"
printf "Command 2: %s\n" "${fw_cmd_2[*]}"
"${fw_cmd_2[@]}"
答案3
您可以使用反斜杠\
转义字符来忽略嵌套的引号:
command="firewall-cmd --permanent --add-rich-rule=\"rule family=ipv4 source address=$1 drop\""
printf "$command\n"
$command
这应该有效。