Bash의 큰 문자열 내에서 큰 따옴표를 어떻게 피할 수 있습니까?
예를 들어, 쉘 스크립트에서
#!/bin/bash
dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"
ENCLOSED BY '\"'
큰 따옴표로 올바르게 탈출 할 수는 없습니다 . variable을 사용하고 싶기 때문에 변수에 작은 따옴표를 사용할 수 없습니다 $dbtable
.
답변
백 슬래시를 사용하십시오.
echo "\"" # Prints one " character.
답변
쉘에서 따옴표를 이스케이프 처리하는 간단한 예 :
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
이미 열린 것을 끝내고 ( '
) 이스케이프 한 것을 놓고 ( \'
) 다른 것을여십시오 ( '
).
또는
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
이미 개설 ( '
) 을 완료 하고 다른 견적 ( "'"
)에 따옴표를 넣은 후 다른 개 ( '
) 를 열면 됩니다.
더 많은 예 : 작은 따옴표로 묶은 문자열 내에서 작은 따옴표를 이스케이프 처리
답변
오늘이 Bash 태그 목록 에이 오래된 문제가 나타나는 이유를 모르겠지만 미래의 연구원을 위해 에코를 필요로하는 문자의 ASCII 코드를 사용하여 탈출을 피할 수 있음을 명심하십시오.
예:
echo -e "This is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22"
This is "'"'"text"'"'"
\x22
큰 따옴표 및 \x27
작은 따옴표 의 ASCII 코드 (16 진)입니다 . 마찬가지로 모든 문자를 에코 할 수 있습니다.
위의 문자열을 백 슬래시로 에코하려고하면 지저분한 두 행의 백 슬래시 에코가 필요하다고 가정합니다. 🙂
변수 할당의 경우 다음과 같습니다.
$ a=$'This is \x22text\x22'
$ echo "$a"
This is "text"
변수가 다른 프로그램에 의해 이미 설정되어있는 경우에도 sed 또는 유사한 도구를 사용하여 큰 따옴표 나 작은 따옴표를 적용 할 수 있습니다.
예:
$ b="Just another text here"
$ echo "$b"
Just another text here
$ sed 's/text/"'\0'"/' <<<"$b" #\0 is a special sed operator
Just another "0" here #this is not what i wanted to be
$ sed 's/text/\x22\x27\0\x27\x22/' <<<"$b"
Just another "'text'" here #now we are talking. You would normally need a dozen of backslashes to achieve the same result in the normal way.
답변
Bash를 사용하면 문자열을 인접하게 배치 할 수 있으며 결국 서로 붙어 있습니다.
그래서 이거:
$ echo "Hello"', world!'
생산
Hello, world!
트릭은 필요에 따라 작은 따옴표와 큰 따옴표를 번갈아 사용하는 것입니다. 불행히도, 그것은 매우 지저분 해집니다. 예를 들면 다음과 같습니다.
$ echo "I like to use" '"double quotes"' "sometimes"
생산
I like to use "double quotes" sometimes
귀하의 예에서 나는 다음과 같이 할 것입니다 :
$ dbtable=example
$ dbload='load data local infile "'"'gfpoint.csv'"'" into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"'"'"' LINES "'TERMINATED BY "'"'\n'"'" IGNORE 1 LINES'
$ echo $dbload
다음과 같은 출력이 생성됩니다.
load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES
여기서 무슨 일이 일어나고 있는지 알기가 어렵지만 유니 코드 따옴표를 사용하여 주석을 달 수 있습니다. 다음은 bash에서 작동하지 않으며 단지 설명을위한 것입니다.
dbload=
‘ load data local infile "
‘“ 'gfpoint.csv'
” ‘ " into
‘“ table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '
” ‘ "
‘“ ' LINES
” ‘ TERMINATED BY "
‘“ '\n'
” ‘ " IGNORE 1 LINES
‘
위의 ” ””와 같은 인용 부호는 bash로 해석됩니다. 따옴표 " '
는 결과 변수로 끝납니다.
이전 예제와 동일한 처리를 수행하면 다음과 같습니다.
$ echo
“ I like to use
” ‘
"double quotes"
‘ “
sometimes
”
답변
printf를 확인하십시오 …
#!/bin/bash
mystr="say \"hi\""
printf를 사용하지 않고
echo -e $mystr
출력 : “hi”라고 말하십시오
printf 사용
echo -e $(printf '%q' $mystr)
출력 : say “”hi \ “
답변
큰 따옴표 문자를 변수로 저장하십시오.
dqt = ' "' echo "큰 따옴표로 묶은 문자열 안에 큰 따옴표 $ {dqt} X $ {dqt}"
산출:
큰 따옴표로 묶인 문자열 안에 큰 따옴표 "X"
답변
$ “string”을 사용하십시오.
이 예에서는
dbload = $ “데이터를 로컬 인파 일 \” ‘gfpoint.csv’\ “를 테이블 $ dbtable에로드 함 ‘TERMINATED BY’, ‘ENCLOSED by’\” ‘LINES TERMINATED BY \ “‘\ n ‘\”IGNORE 1 LINES “
참고 ( man 페이지에서 ) :
큰 따옴표로 묶은 문자열 앞에 달러 기호 ($ “string”)가 있으면 문자열이 현재 로케일에 따라 변환됩니다. 현재 로케일이 C 또는 POSIX 인 경우 달러 기호는 무시됩니다. 문자열이 번역 및 교체되면 교체는 큰 따옴표로 묶습니다.