Bash 스크립트: Bash 스크립트에 변수를 삽입하는 방법은 무엇입니까?

Bash 스크립트: Bash 스크립트에 변수를 삽입하는 방법은 무엇입니까?

다음 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

관련 정보