
最初のリクエストが明確ではないので申し訳ありません。
私は非常に単純なbashスクリプトコマンドを使用しようとしましたが、一重引用符文字のために問題が発生しました。私の意図は、コマンドラインで変数(サブネット表記)を許可し、特定の構文(混乱した一重引用符を含む)を使用してファイアウォールを実行するコマンドを実行するシェルスクリプトを作成することです。 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の出力を変数に割り当てようとしたら、startすべてのバックスラッシュを入れます。
どんなアイデアがありますか?ティア
答え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
これはうまくいきます。