使用命令行变量创建命令(带单引号),然后执行它

使用命令行变量创建命令(带单引号),然后执行它

我很抱歉我的第一个请求没有更清楚。

我一直在努力尝试获取一个非常简单的 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

感谢大家的帮助。底线是,我是:

  1. 想太多了,并且
  2. 我以为我必须在执行的字符串中使用单引号,但实际上双引号是有效的。

我很确定问题在于尝试在命令中正确包含单引号。我最终得到的有效的结果是:

#! /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

这应该有效。

相关内容