아래 명령과 동일한 작업을 수행하기 위해 bash 스크립트를 만들려고합니다.
dig -x 8.8.8.8 | grep PTR | cut -d ' ' -f 2 | grep google | cut -f 5
출력은 google-public-dns-a.google.com.
이제 아래와 같이 test.sh 스크립트를 만들었습니다.
#!/bin/bash
IP=$1
output1=$(dig -x $IP)
grepg="grep PTR | cut -d ' ' -f 2 | grep google | cut -f 5"
go=$($output1 | $grepg)
echo $go
스크립트를 ./test.sh 8.8.8.8로 불렀습니다. 그러나 오류가 발생합니다. 따옴표를 사용하여 bash 변수에 Linux 명령을 효과적으로 저장할 수 있습니까?
감사
여기에 몇 가지 문제가 있습니다.
첫 번째는 당신이 명령 변수의 내용으로 실행하기 위해 노력하고 있다는 것입니다 $ouptut1
단지이며, dig
출력; 명령이 아닙니다. 당신은 아마 echo $output1
.
그런 다음 변수의 내용을 $grepg
파이프 라인으로 실행하려고합니다 . 그러나 복합 명령 (파이프 라인은 복합 명령)의 구성 요소로 행을 구문 분석하는 것은 매개 변수 확장 전에 발생합니다. 따라서 다음과 같이 실행하면 :
foo="echo hello | grep hi"
$foo
이것은 먼저 하나의 간단한 명령으로 분리 된 다음 명령이 확장 된 다음 인수로 구문 분석됩니다. 따라서 이것은 실행하는 것과 동일합니다.
echo hello "|" grep hi
일반적으로 평가할 텍스트 문자열을 변수에 저장하는 것은 좋지 않습니다. 당신이 그것을 원할 수있는 아주 특별한 경우가 몇 가지 있지만, 거의 모든 경우에 (그리고 아마도 당신의 경우) 그것을하는 더 좋은 방법이 있습니다. 이에 대해 경고 하겠지만 실제로 문자열을 명령으로 평가하려면를 사용할 수 있습니다 eval
. 예를 들면 다음과 같습니다.
go=$(echo $output1 | eval $grepg)
당신이 원하는 것은 쉘 함수를 정의하는 것입니다. 해당 파이프 라인을 여러 번 재사용하고이를 통해 여러 다른 값을 실행하려면 쉘 함수를 정의하기 만하면됩니다. 이 함수는 포함 된 명령과 동일한 역할을하는 단일 명령입니다.
function grepg() {
grep PTR | cut -d ' ' -f 2 | grep google | cut -f 5
}
go=$(echo $output1 | grepg)
코드를 더 단순화하기 위해 모든 중간 변수를 피할 수 있습니다. dig
명령 의 결과를으로 파이프하려는 grepg
경우에는이를 수행하기 전에 변수에 저장할 필요가 없습니다. 그리고 결과를 stdout에 에코하려면 다시 변수에 저장할 필요가 없습니다. 출력을 stdout으로 보낼 수 있습니다.
#!/bin/bash
IP=$1
function grepg() {
grep PTR | cut -d ' ' -f 2 | grep google | cut -f 5
}
dig -x $IP | grepg
여기서는 스크립트에서 여러 번 사용할 수 있도록 함수를 제외하고 싶다고 가정합니다. 그렇지 않은 경우 한 번만 사용하려는 경우 다음과 같이 더 단순화 할 수 있습니다.
#!/bin/bash
IP=$1
dig -x $IP | grep PTR | cut -d ' ' -f 2 | grep google | cut -f 5
이와 같은 파이프 라인을 변수에 저장하여 다른 코드를 사용하여 두 함수 사이를 결정하고 어떤 조건에 따라 하나 또는 다른 것을 적용하려면 위와 같이 함수를 정의하는 것이 좋습니다. 그런 다음 변수에 단일 함수 이름을 저장합니다. 예상대로 작동합니다.
function grepg() {
grep PTR | cut -d ' ' -f 2 | grep google | cut -f 5
}
function grepf() {
# do something else, I'm not creative enough to come up with a good example
}
if [ "$2" = "foo" ]
then
func=grepg
else
func=grepf
fi
dig -x $IP | $func
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다