2017-03-25 1 views
1

bash에서 단일 및 이중 따옴표에 적용되는 내용은 general rules입니다. 그러나 중첩 된 내용이 더 깊어 질수록 길을 잃을 것입니다. 예를 들어Bash에서의 단일 대 큰 따옴표 혼동

은 어떤 것은

export VAR=$(echo "${VAL}-venv" | awk '{print tolower($0)}') 

export VAR=$(echo "${VAL}-venv" | awk "{print tolower($0)}") 

사이 또는

$(somecmd "${ROLE_NAME}" | someothercmd) 

"$(somecmd "${ROLE_NAME}" | someothercmd)" 
사이의 물질에 대한 차이

답변

2
awk '{print tolower($0)}' 

은 셸이 확장되지 않도록합니다. $0. awk는 $0을 보게됩니다.

awk "{print tolower($0)}" 

는 쉘이 현재 스크립트 나 쉘, 대화 형 세션에서 -bash 같은 이름으로 $0을 확장합니다. awk는

print tolower(-bash) 

을 볼 수 도착하고 bash라는 어떤 변수에 대해 알고하지 않기 때문에, 그것은

somecmd "${ROLE_NAME}" | someothercmd 

과의 출력을 0

$(somecmd "${ROLE_NAME}" | someothercmd) 

에 초기화 반환 출력은 단어 분리와 glob 확장을 겪습니다.

"$(somecmd "${ROLE_NAME}" | someothercmd)" 

도 동일하지만 단어 분할 및 glob 확장이 발생하지 않습니다. 그러나

명령 교체는 기본적으로 억제 로빙 워드 분할, 할당의 우측에있는 경우 :

var=$(somecmd "${ROLE_NAME}" | someothercmd) 

var="$(somecmd "${ROLE_NAME}" | someothercmd)" 

그것을 동등 그래도 상처를주지 않는다.

"suppress by default"문은 전체적으로 오른쪽에만 적용됩니다. 내에서 이내에, 당신은 여전히 ​​견적을해야합니다. 배열을 다룰 때 중요하다 : 단지 확장 적용

$ myfunc() { echo 1 2 3; }     # Generates three words 
$ arr=($(myfunc))       # Unquoted within() 
$ declare -p arr 
declare -a arr='([0]="1" [1]="2" [2]="3")' # Three array elements 
$ arr=("$(myfunc)")       # Quoted within() 
$ declare -p arr 
declare -a arr='([0]="1 2 3")'    # One array element 

을 관찰 그리고 마지막으로, "자동으로 오른쪽에 인용 된, 즉, var=$1 (따옴표가 필요 없음) 또는 var=$(command) ($() 주위에 필요한 따옴표; 어쩌면 command 내에서 필요할 수 있습니다. 아니요 오른쪽에 공백이있는 경우 적용 : var=a b c아니요a b c을 var에 할당하십시오.환경 변수 var을 값 a으로 설정 한 다음 c 인수로 b 명령을 실행합니다.

+0

두 번째 예에서는 실제 사용으로 인해 다른 동작이 발생합니다. 나는 '--role $ (aws iam get-role --role)'형식의 [논쟁] (http://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html)을 가지고있다. -name "$ {ROLE_NAME}"| jq -raw-output '.Role.Arn')'잘 작동하지만'--role "$ (aws iam get-role --role-name"$ {ROLE_NAME} " | jq --raw-output '.Role.Arn') ""모든 종류의 오류를 생성합니다. – orome

+0

@raxacoricofallapatorius 그것은'jq'의 입력과'--role'이 기대하는 옵션의 종류에 달려 있습니다. –

+0

그러나 두 경우 모두 바깥 쪽 따옴표 안의 모든 내용을 처리하지는 않습니까? 바깥 쪽 따옴표를 추가하면 전체 프로세스의 맨 마지막 부분에서 분할과 glob 확장을 방지 할 수 있습니다. 이 경우 관련된 값은 동일합니다 (특수 문자의 공백 없음). – orome