
다음 bash 스크립트는 완벽하게 실행됩니다.
#!/bin/bash
echo '!PaSsWoRd!' | openconnect --csd-wrapper=/home/user/.cisco/csd-wrapper.sh --authenticate --user=abcde123 --authgroup="tunnel My Company" --passwd-on-stdin vpn.mycompany.com
그러나 이전 입력 매개변수를 다음과 같은 변수로 바꾸고 싶습니다.
#!/bin/bash
WRAPPER=/home/user/.cisco/csd-wrapper.sh
USER=abcde123
PASSWD=!PaSsWoRd!
AUTHGROUP=tunnel My Company
DOMAIN=vpn.mycompany.com
echo '$PASSWD' | openconnect --csd-wrapper=$WRAPPER --authenticate --user=$USER --authgroup="$AUTHGROUP" --passwd-on-stdin $DOMAIN
불행히도 이 시도는 더 이상 작동하지 않습니다. 따옴표나 유사한 문자를 입력해야 할 것 같습니다. 다음 bash 스크립트에 어떤 문제가 있는지 알고 계십니까?
답변1
!
여기서 문제는 포함된 변수에 값을 할당할 때 따옴표가 누락된다는 것입니다. 쉘은 !
변수에 할당하기 전에 먼저 기록 확장을 실행하기 위해 문자를 해석하려고 시도합니다. 인용은 쉘이 내용을 '..'
특별하게 해석하는 것을 방지하고 그대로 두어야 합니다.
숙제는 다음과 같이 작성해야 합니다.
PASSWD='!PaSsWoRd!'
인용된 확장을 통해 변수를 전달합니다.
echo "$PASSWD" | openconnect --csd-wrapper="$WRAPPER" --authenticate --user="$USER" --authgroup="$AUTHGROUP" --passwd-on-stdin "$DOMAIN"
set +H
또는 스크립트 상단에 줄을 추가하여 스크립트에서 기록 확장을 일시적으로 해제하세요. 그런 다음 마지막에 이를 수행하여 set -H
비활성화합니다. 이는 권장되지 않으며 위에 인용된 올바른 방법을 사용하는 것이 좋습니다.
답변2
첫 번째 예에서 문자열을 사용할 때 적용한 것과 동일한(올바른) 논리를 사용해야 합니다.양수인문자열을 변수로 변환할 수도 있습니다.
AUTHGROUP=tunnel My Company
세 단어 모두 분열적입니다. 스크립트에서 작업 하지만 셸에서 해석되어 기록 확장이 발생한다는 PASSWD=!PaSsWoRd!
점을 명심하세요 .!
작은따옴표는 묶인 각 문자의 리터럴 값을 유지하는 반면, 큰따옴표는 예외를 허용합니다: $
, `
및 \
( !
의 인용 참조 man bash
). 그런 다음 PASSWD='!PaSsWoRd!'
작동하지만 작동 PASSWD="!PaSsWoRd!"
하지 않습니다(그러나 다시 말하지만 !
스크립트가 아닌 대화형 셸에서만 문제가 됩니다).
동시에, 언제사용변수: 변수 값이 아닌 echo '$PASSWD'
텍스트를 에코합니다 .$PASSWD