명령줄 변수(작은따옴표 포함)를 사용하여 명령을 만든 다음 실행합니다.

명령줄 변수(작은따옴표 포함)를 사용하여 명령을 만든 다음 실행합니다.

첫 번째 요청이 명확하지 않아서 죄송합니다.

나는 매우 간단한 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

모두의 도움에 감사드립니다. 결론은, 나는:

  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

이것은 작동합니다.

관련 정보