작은 따옴표와 큰 따옴표가있는 인수를 쉘 스크립트에 전달하고이 인수로 실행하려고합니다. 에코에서 올바르게 인쇄되지만 명령의 경우 "Unterminated quoted value"로 표시됩니다.
스크립트 및 인수 전달 방법을 참조하십시오.
[root@geopc]/root# ./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="PS MarkSweep" -A CollectionCount -K duration'
#!/bin/bash
out=`/usr/lib64/nagios/plugins/check_jmx -U service:jmx:rmi:///jndi/rmi://$1`
echo $1
echo $out
실행 후 다음과 같이 출력됩니다.
$ 1 : localhost : 9199 / jmxrmi -O java.lang : type = GarbageCollector, name = "PS MarkSweep"-A CollectionCount -K 기간
$ out : JMX CRITICAL 종결되지 않은 따옴표 값
쉘 스크립트에서 우리는 $ 1의 값을 하드 코딩 한 다음 실행하면 올바른 결과를 얻습니다.
다음과 같이 인수 전달을 시도했습니다.
./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name=\"PS MarkSweep\" -A CollectionCount -K duration'
이 경우 오류는 다음과 같습니다. JMX CRITICAL 속성 값 부분의 잘못된 문자 ' "'
./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="\"PS MarkSweep\"" -A CollectionCount -K duration'
이 경우 오류는 JMX CRITICAL입니다.
그러니 누구든지 저를 도와주세요.
문제는 변수의 따옴표와 이스케이프가 스크립트의 따옴표와 동일하게 해석 될 것으로 예상한다는 것입니다.
Java 용어로 이것은 예상과 동일합니다.
String input="\"foo\", \"bar\"";
String[] parameters = { input };
다음과 동일합니다.
String[] parameters = { "foo", "bar" };
두 언어의 실제 해결책은 입력을 요소의 배열로 만드는 것입니다.
#!/bin/bash
out=`/usr/lib64/nagios/plugins/check_jmx -U service:jmx:rmi:///jndi/rmi://"$1" "${@:2}"`
echo "$1"
echo "$out"
다음 실행 :
./myscript.sh localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="PS MarkSweep" -A CollectionCount -K duration
하나!!
이를 위해서는 규율과 이해가 필요합니다.
이것이 드롭 인 솔루션이 아니라는 것을 알 수 있습니다. 이제 스크립트가 여러 매개 변수로 호출되고 있습니다. 이것은 매우 엄격한 요구 사항입니다. 이 스크립트가 다른 프로그램에서 호출되는 경우 해당 프로그램도이를 인식해야합니다. 종단 간 처리되어야합니다.
예를 들어이를 구성 파일에 저장하면 목록으로 역 직렬화 할 수있는 방식으로 문자열을 직렬화하는 것은 사용자의 책임입니다. 당신은 그것이 잘 될 것이라고 기대할 수 없습니다. Java와 달리 문자열과 목록을 혼동 할 때 컴파일러 경고가 없습니다.
이것이 당신이 관여하고 싶지 않은 것이 아니라면 대신 사용할 수 있습니다 eval
. 이것은 보안 및 견고성 문제로 인해 나쁜 습관이지만 때로는 충분합니다.
yourcommand="/usr/lib64/nagios/plugins/check_jmx -U service:jmx:rmi:///jndi/rmi://$1"
echo "$yourcommand" # Make sure this writes the right command
eval "$yourcommand" # This will execute it as if you copy-pasted it
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다