[Shell Script] Quotes - 2
2022.06.04 - [Shell Script] Quotes - 1에 이어서 작성한다.
Single quotes ' '
모든 문자를 그대로 표시하며 escape도 되지 않는다.
따옴표로 감싼 문자열 내에서 따옴표를 입력할 때는 아래와 같은 방법으로 입력한다.
- no quotes 상태에서 ' escape
- '를 쌍따옴표로 감싸기
echo 'test'\''test'
echo 'test'"'"'test'
Single quotes 사용이 필요한 경우
1. Command String 사용 시
큰따옴표를 사용하면 작성 당시 변숫값이 확장되어 정의되므로 실행 시 의도대로 동작하지 않을 수 있다.
2. Trap Handler 사용 시
3. Prompt 설정
$' '
escape를 사용할 수 있는 single quotes와 동일하다. escape 문자가 처리된 후에는 $가 제외된 ' ' 상태가 된다.
sh에서는 사용할 수 없다.
foo=$'aaa\nbbb'
echo "$foo"
echo -e 옵션을 사용하지 않아도 escape 문자가 처리되어 출력된다.
printf %q
%q 지정자는 명령에 사용되는 인수나 명령문 전체를 다른 명령으로 올바르게 전달할 수 있게 escape 해준다.
arg=$( printf "%q " "$( echo -e "foo? bar\n*bar[3]" )" )
echo $arg
arg=$( printf "%q " "$( echo -e "foo bar\n*zoo[3]" )" )
echo $arg
문자열에 escape 문자가 포함되면 $' ' 형태로 출력된다.
Quotes를 분리해서 작성하는 경우
중간의 공백은 하나의 space로 변경된다.
Quotes를 붙여 사용하기
두 개의 quotes를 공백을 두지 않고 붙여 사용하면 하나의 인수가 된다. 변수를 포함하는 명령 스트링을 만들 거나 명령에 전달할 인수를 하나로 만들 때 유용하다.
명령 스트링을 만들 때
' '를 사용한 명령문 내에 변수를 사용해야 할 때에는 ' '를 분리한 후 double quotes 처리한 변수를 공백 없이 붙여 사용하면 된다.
# 예시
sed -E 's/'"$var1/$var2"'/g'
명령의 인수를 만들 때
두 quotes를 붙여서 사용하면 하나의 인수로 취급된다.
$ ./args.sh 11 "hello "$'$world \u2665' 33 # $' ' quotes 을 사용
$0 : ./args.sh
$1 : 11
$2 : hello $world ♥
$3 : 33
참고 문서
https://mug896.github.io/bash-shell/quotes.html