작은 따옴표를 사용하여 쉘에서 특수 문자를 래핑 할 때 '한 따옴표'를 에코하는 방법은 무엇입니까?


26

나는 오늘 http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm 에서 쉘 튜토리얼을 읽고 있습니다 .

그것은 언급합니다 :

출력 할 문자열 내에 작은 따옴표가 나타나면 전체 문자열을 작은 따옴표 안에 넣지 말고 대신 다음과 같이 백 슬래시 ()를 사용하는 것보다 우선합니다.

echo 'It\'s Shell Programming'

나는 centos 서버에서 이것을 시도했지만 작동하지 않습니다 >. 더 입력하라는 메시지 가 나타 납니다.

나는 두 개의 작은 따옴표는 이스케이프 기호를 포함 일반 문자로 모든 특수 문자를 변환하기 때문에, 궁금 해서요 \(가) 자체 만 제외 ',
어떻게 하나의 작은 따옴표를 대표해야 '단일 인용 문구에?


1
왜 사용하지 않는 echo It\'s Shell Programmingecho "It's Shell Programming"?
cuonglm

@cuonglm, 다음과 같은 문구를 사용할 수 있기 때문에echo Wow, I'm going to have lots of $$$$$$ now
Zen

2
따라서 큰 따옴표를 사용하고 이스케이프해야합니다 $. 비슷한 것 echo Wow, I\'m going to have lots of \$\$\$\$\$\$ now또는 그냥echo Wow, I\'m going to have lots of '$$$$$$' now
cuonglm

@ cuonglm, 예, 할 수 있으며 어떻게 할 수 있는지 알고 있습니다. 그러나 내가 읽은 자습서는 작은 따옴표로 묶은 작은 따옴표를 피할 수있는 방법이 있다고 확신하지만 주어진 자습서 예제는 작동하지 않습니다. 그래서 누군가가 해결책을 알고 있을지 궁금합니다.
Zen

1
이건 어때요? echo 'It'"'"'s Shell Programming'. 나는 그것을 작은 따옴표로 묶은 첫 번째와 마지막 3 문자열로 나눕니다. 그러나 중간 따옴표는 큰 따옴표로 묶은 작은 따옴표를 가지고 있습니다.
jcbermu

답변:


49

튜토리얼이 잘못되었습니다.

POSIX의 말 :

작은 따옴표는 작은 따옴표 안에있을 수 없습니다.

대안은 다음과 같습니다.

echo $'It\'s Shell Programming'  # ksh, bash, and zsh only, does not expand variables
echo "It's Shell Programming"   # all shells, expands variables
echo 'It'\''s Shell Programming' # all shells, single quote is outside the quotes
echo 'It'"'"'s Shell Programming' # all shells, single quote is inside double quotes

더 읽을 거리 : 인용구-그렉의 위키


4
하나 더 : echo 'It''s Shell Programming'-와 zsh을 rc_quotes옵션 세트 (와 RC 쉘도) - 작은 따옴표 안에 작은 따옴표 한 쌍은 하나의 작은 따옴표를 나타냅니다.
Michał Politowski

5
나는 때때로 이것을 사용 q="'"하여 qq='"'더 깨끗하게 만듭니다. 그러면 허용됩니다 echo "It${q}s ${qq}Shell Programming${qq}"(말미가 주어지면 대괄호가 필요합니다). POSIX 안전. 외부 레이어는 큰 따옴표로 묶어야합니다.
Adam Katz

1

당신이 사용할 수있는:

sed "s/'"'/&\\&&/g
     s/.*/'"'&'"'/
' <<IN
$arbitrary_value
IN

줄당 값 줄을 안전하게 쉘 인용하십시오.

셸에 따라 다음과 같은 옵션이있을 수도 있습니다.

printf %q\\n "$arbitrary_value"

나는 일반적으로 선호하지만

a=$(alias "a=$arbitrary_value" a); a=${a#*=}

보다 수동적 인 접근 방식은 다음과 같습니다.

sq(){ set \' "$1"
      while case $2 in (*\'*) :;;
      (*) ! RETURN="$1$2'"     ;;esac
      do  set "$1${2%%\'*}'\''" "${2#*\'}"
      done
}

... 적어도 포크는 없습니다.


1
나는 printf %q\\n "$arbitrary_value"다른 사람들이 너무 복잡하다는 것을 제외하고는 당신이 말하는 것에 대해 전혀 모른다 .
Zen

1

작은 따옴표와 큰 따옴표를 혼합하여 파일에 넣는 다른 사람이 오는 경우에도 작동합니다.

cat > its-shell-programing.txt << __EOF__
echo $'It\'s Shell Programming'
echo "It's Shell Programming"
echo 'It'\''s Shell Programming'
echo 'It'"'"'s Shell Programming'
__EOF__

쉘이 변수로 볼 수있는 모든 것은 백 슬래시로 이스케이프되어야합니다.

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.