bash는 작은 따옴표를 추가합니다


14

스크립트를 실행하는 데 문제가 있습니다.
디버그 모드 (bash -x)에서 실행할 때 bash가 따옴표를 추가하고 있음을 알 수 있습니다. 따라서 내 스크립트가 실패합니다.

여기 내 스크립트 안에 있습니다.

testvar="\"sudo /home/pi/shared/blink.sh 27 off\""
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar}

이것은 출력입니다.

ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'

답변:


9

Bash는 유효한 입력 구문 인 명령을 표시하기 위해 작은 따옴표를 표시합니다. 명령에 대한 매개 변수에 이러한 작은 따옴표가 포함 된 명령을 실행하지 않습니다 ssh.

ssh  '"sudo' /home/pi/shared/blink.sh 27 'off"'

ssh 명령의 마지막 4 개 매개 변수가 있음을 알려줍니다 "sudo, /home/pi/shared/blink.sh, 27off".

원격 호스트에서 ssh 데몬은 명령의 단어를 공백으로 구분 기호로 결합하므로 실행중인 원격 명령은 다음과 같습니다.

"sudo /home/pi/shared/blink.sh 27 off"

이름이 sudo /home/pi/shared/blink.sh 27 off인 명령을 실행하려고 합니다. 물론 존재하지 않습니다.

의 정의에서 큰 따옴표를 제거하십시오 testvar.

여기서는 중요하지 않지만 실제 경우에는 중요합니다. 대신 ${testvar}씁니다 "$testvar"(또는 "${testvar}"원하는 경우 중괄호는 선택 사항입니다). 변수를 생략해야하는 이유를 모르는 경우 변수 치환을 항상 큰 따옴표로 묶으 십시오. 큰 따옴표로 묶지 않으면 공백으로 구분 된 glob 패턴 목록으로 값을 처리하는 반면, "$testvar"는 변수 값으로 확장됩니다 .testvar$testvartestvar


3

나는 당신이 사용해야한다고 생각합니다 :

testvar="sudo /home/pi/shared/blink.sh 27 off"
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 "${testvar}"

이것은 나를 위해 일하고 있습니다 :

$ bash -x -c 'testvar="la la la"; echo "${testvar}"'
+ testvar='la la la'
+ echo 'la la la'
la la la

그러나 내가했던 것처럼 똑같이 쓰면 같은 결과가 나옵니다.

$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"

따옴표는 여러 단어를 그룹화하여 단일 인수를 구성하는 쉘의 메커니즘이기 때문에 중요합니다.
glenn jackman

2

쉘은 변수의 값을 단어로 나눕니다. 분할을 방지하기 위해 큰 따옴표를 사용하십시오. 차이점을보십시오 :

t='"a b c"'
set -xv
echo $t
echo "$t"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.