bash가 작은따옴표 사이의 기록/느낌표를 확장하는 이유는 무엇입니까?

bash가 작은따옴표 사이의 기록/느낌표를 확장하는 이유는 무엇입니까?

저는 처음부터 서버를 구성하는 스크립트를 만들고 있는데 그 중 일부는 postgres입니다. 내가 겪고 있는 문제 중 하나는 임의의 비밀번호에 느낌표가 있으면 bash에 의해 확장되는 것 같습니다.

다음 postgres 명령을 실행하고 싶습니다.

alter user root with encrypted password 'D1£example!2eNZY6P$9examplePassword';

그러나 bash 스크립트에서는 다음을 사용합니다.

psql -c "command;"

사용:

runuser -l postgres -c "above cammand"

그래서 나는 그것을 얻습니다:

psqlcmd1="psql -c \"""alter user root with encrypted password 'D1£LF1A\!2eNZY6P$9examplePassword';""\""
runuser -l postgres -c "$psqlcmd1"

하지만 bash는 작은따옴표 사이에도 확장됩니다!

또한 다음을 시도했습니다.기반운이 좋지 않으면 작은따옴표를 피하십시오.

runuser -l postgres -c "psql -c 'alter user root with encrypted password '"'"'D1£example!2eNZY6P$9examplePassword'"'"';'"

답변1

psqlcmd1="psql -c \"""alter user root with encrypted password 'D1£LF1A\!2eNZY6P$9examplePassword';""\""

기록 확장을 끈 후의 psqlcmd1값 은 다음과 같습니다.

psql -c "alter user root with encrypted password 'D1£LF1A\!2eNZY6PexamplePassword;"

큰따옴표 내에서 독립형이 아닌 유일한 문자는 \"$`플러스 입니다 !(히스토리 확장이 활성화된 경우). 특히 '내부 큰따옴표는 그 자체를 나타냅니다. 문자열 리터럴을 시작하지 않고 큰따옴표가 이미 문자열 리터럴을 시작합니다. 또한 $변수 확장은 활성화되어 있기 때문에 확장됩니다 $9. 해당 값은 현재 함수 스크립트의 9번째 인수이거나 인수가 9개 미만인 경우 비어 있습니다.

또한 "foo""bar"이는 다음과 같습니다 "foobar". 두 개의 문자열 리터럴이 연결된 것이므로 단일 문자열 리터럴로 작성할 수도 있습니다.

\"$`결과 문자열에 해당 문자가 포함되도록 하려면 큰따옴표 내에서 문자 앞에 백슬래시를 추가해야 합니다. 이는 다음에는 적용되지 않습니다 !. 스크립트의 문자열이지만 "!"활성화된 경우 기록 확장이 호출됩니다. 작은따옴표를 사용하거나 따옴표를 사용하지 않아야 합니다. 가장 간단한 방법은 작은따옴표 리터럴을 사용하는 것입니다. 작은따옴표를 제외하고 작은따옴표 안의 모든 문자는 자신을 나타냅니다. 작은따옴표 리터럴 내에 작은따옴표를 포함하려면 리터럴을 종료한 다음 백슬래시를 사용하여 작은따옴표를 묶고 작은따옴표 리터럴을 시작합니다. 즉, 작은따옴표 리터럴 내에 작은따옴표를 포함합니다. 쓰다.!"\!"\!!'\''

psqlcmd1='alter user root with encrypted password '\''D1£example!2eNZY6P$9examplePassword'\'';'

관련 정보