programing

Bash를 사용할 때 이스케이프해야 하는 문자는 무엇입니까?

powerit 2023. 4. 19. 00:33
반응형

Bash를 사용할 때 이스케이프해야 하는 문자는 무엇입니까?

Bash에서 이스케이프해야 하는 캐릭터의 포괄적인 리스트가 있습니까?sed

저는 '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.%탈출해야 할지 말아야 할지.는 시도했다.

echo "h%h" | sed 's/%/i/g'

일을 %. 그 말은%출할할 필요? ???이것이 필요성을 확인하는 좋은 방법이었나요?

좀 더 은, 이 두 글자가 인가 하는 것입니다.shell ★★★★★★★★★★★★★★★★★」bash

두 가지 쉽고 안전한 규칙이 있습니다.sh, '''도 마찬가지입니다''bash.

1. 스트링 전체를 작은 따옴표로 묶는다.

이것은 단일 따옴표 자체를 제외한 모든 문자에 대해 작동합니다.단일 인용문을 사용하지 않으려면 인용문 앞에 있는 인용문을 닫고 단일 인용문을 삽입한 다음 인용문을 다시 여십시오.

'I'\''m a s@fe $tring which ends in newline
'

명령어: sed "sed" 명령어:sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/"

2. 백슬래시로 모든 문자를 탈출합니다.

이것은 줄바꿈을 제외한 모든 문자에 적용됩니다.줄바꿈 문자의 경우 작은따옴표 또는 큰따옴표를 사용합니다.빈 문자열은 계속 처리해야 합니다. 다음 문자열로 대체합니다.

\I\'\m\ \a\ \s\@\f\e\ \$\t\r\i\n\g\ \w\h\i\c\h\ \e\n\d\s\ \i\n\ \n\e\w\l\i\n\e"
"

명령어: sed "sed" 명령어:sed -e 's/./\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/'.

2b. 읽기 쉬운 버전 2

쉽게 안전한 캐릭터 세트도 있고[a-zA-Z0-9,._+:@%/-] 둘 수

I\'m\ a\ s@fe\ \$tring\ which\ ends\ in\ newline"
"

명령어: sed "sed" 명령어:LC_ALL=C sed -e 's/[^a-zA-Z0-9,._+@%/-]/\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/'.


sed 프로그램에서는 입력의 마지막 행이 줄바꿈 바이트로 끝나는지 여부를 알 수 없습니다(비어 있는 경우 제외).그래서 위의 SED 명령어 모두 그렇지 않다고 가정한 겁니다따옴표로 묶인 새 줄을 수동으로 추가할 수 있습니다.

셸 변수는 POSIX 의미의 텍스트에만 정의됩니다.이진 데이터 처리가 정의되지 않았습니다.중요한 실장에서는 바이너리는 NUL 바이트를 제외하고 동작합니다(변수는 C 문자열로 구현되어 C 문자열, 즉 프로그램 인수로 사용되기 때문입니다). 단, latin1과 같은 "바이너리" 로케일로 전환해야 합니다.


(의할 수 shbash의 경우 @AustinPhillips에 링크된 참조 매뉴얼을 확인하십시오.

셸 입력으로 재사용할 수 있는 형식

2021년 2월 : bash ${var@Q}

bash에서 변수 콘텐츠를 파라미터 확장과 함께 저장할 수 있습니다.@파라미터 변환 명령:

${parameter@operator}
       Parameter transformation.  The expansion is either a transforma‐
       tion of the value of parameter or  information  about  parameter
       itself,  depending on the value of operator.  Each operator is a
       single letter:

       Q      The expansion is a string that is the value of  parameter
              quoted in a format that can be reused as input.
...
       A      The  expansion  is  a string in the form of an assignment
              statement or declare command  that,  if  evaluated,  will
              recreate parameter with its attributes and value.

샘플:

$ var=$'Hello\nGood world.\n'
$ echo "$var"
Hello
Good world.

$ echo "${var@Q}"
$'Hello\nGood world.\n'

$ echo "${var@A}"
var=$'Hello\nGood world.\n'

구답

특별한 게 있어요 printf directive형식 디렉티브)%q는,

printf [-v var]형식 [printf]

 %q     causes printf to output the corresponding argument
        in a format that can be reused as shell input.

일부 샘플:

read foo
Hello world
printf "%q\n" "$foo"
Hello\ world

printf "%q\n" $'Hello world!\n'
$'Hello world!\n'

이것은 변수를 통해서도 사용할 수 있습니다.

printf -v var "%q" "$foo
"
echo "$var"
$'Hello world\n'

모든(128) ASCII 바이트에 대한 빠른 확인:

128 ~ 255의 모든 바이트는 이스케이프해야 합니다.

for i in {0..127} ;do
    printf -v var \\%o $i
    printf -v var $var
    printf -v res "%q" "$var"
    esc=E
    [ "$var" = "$res" ] && esc=-
    printf "%02X %s %-7s\n" $i $esc "$res"
done |
    column

이렇게 하면 다음과 같은 결과를 얻을 수 있습니다.

00 E ''         1A E $'\032'    34 - 4          4E - N          68 - h      
01 E $'\001'    1B E $'\E'      35 - 5          4F - O          69 - i      
02 E $'\002'    1C E $'\034'    36 - 6          50 - P          6A - j      
03 E $'\003'    1D E $'\035'    37 - 7          51 - Q          6B - k      
04 E $'\004'    1E E $'\036'    38 - 8          52 - R          6C - l      
05 E $'\005'    1F E $'\037'    39 - 9          53 - S          6D - m      
06 E $'\006'    20 E \          3A - :          54 - T          6E - n      
07 E $'\a'      21 E \!         3B E \;         55 - U          6F - o      
08 E $'\b'      22 E \"         3C E \<         56 - V          70 - p      
09 E $'\t'      23 E \#         3D - =          57 - W          71 - q      
0A E $'\n'      24 E \$         3E E \>         58 - X          72 - r      
0B E $'\v'      25 - %          3F E \?         59 - Y          73 - s      
0C E $'\f'      26 E \&         40 - @          5A - Z          74 - t      
0D E $'\r'      27 E \'         41 - A          5B E \[         75 - u      
0E E $'\016'    28 E \(         42 - B          5C E \\         76 - v      
0F E $'\017'    29 E \)         43 - C          5D E \]         77 - w      
10 E $'\020'    2A E \*         44 - D          5E E \^         78 - x      
11 E $'\021'    2B - +          45 - E          5F - _          79 - y      
12 E $'\022'    2C E \,         46 - F          60 E \`         7A - z      
13 E $'\023'    2D - -          47 - G          61 - a          7B E \{     
14 E $'\024'    2E - .          48 - H          62 - b          7C E \|     
15 E $'\025'    2F - /          49 - I          63 - c          7D E \}     
16 E $'\026'    30 - 0          4A - J          64 - d          7E E \~     
17 E $'\027'    31 - 1          4B - K          65 - e          7F E $'\177'
18 E $'\030'    32 - 2          4C - L          66 - f      
19 E $'\031'    33 - 3          4D - M          67 - g      

번째 두 필드에는 16진수 값이 포함됩니다.E문자를 이스케이프할 필요가 있고 세 번째 필드에 이스케이프된 문자 표시가 표시되는 경우.

★★★★,

항상 탈출할 필요는 없는 캐릭터를 볼 수 있습니다.,,} ★★★★★★★★★★★★★★★★★」{.

그래서 항상은 아니지만 언젠가:

echo test 1, 2, 3 and 4,5.
test 1, 2, 3 and 4,5.

또는

echo test { 1, 2, 3 }
test { 1, 2, 3 }

하지만 주의:

echo test{1,2,3}
test1 test2 test3

echo test\ {1,2,3}
test 1 test 2 test 3

echo test\ {\ 1,\ 2,\ 3\ }
test  1 test  2 test  3

echo test\ {\ 1\,\ 2,\ 3\ }
test  1, 2 test  3 

다른 사람을 RTFM에서 구하려면... bash에서:

안에 값이 단, 따옴표 안에 있는 문자는 예외입니다.$,`,\하게 되어 있는 「」를 참조해 주세요.!.

...그러므로, 이러한 문제(그리고 인용문 자체)를 회피하면, 아마 문제가 없을 것입니다.

좀 더 보수적인 '의심할 때 이스케이프' 접근 방식을 취하면 식별자 문자(ASCII 문자, 숫자 또는 '_')를 이스케이프하지 않음으로써 특별한 의미가 있는 문자를 대신 얻는 것을 피할 수 있습니다.(즉, 이상한 POSIX와 같은 셸에서) 특별한 의미를 가지기 때문에 회피할 필요가 있는 경우는 거의 없습니다.

「 」의 print '%q' 어떤 문자가 특별한지 알아내기 위해 루프를 실행할 수 있습니다.

#!/bin/bash
special=$'`!@#$%^&*()-_+={}|[]\\;\':",.<>?/ '
for ((i=0; i < ${#special}; i++)); do
    char="${special:i:1}"
    printf -v q_char '%q' "$char"
    if [[ "$char" != "$q_char" ]]; then
        printf 'Yes - character %s needs to be escaped\n' "$char"
    else
        printf 'No - character %s does not need to be escaped\n' "$char"
    fi
done | sort

다음과 같은 출력이 제공됩니다.

No, character % does not need to be escaped
No, character + does not need to be escaped
No, character - does not need to be escaped
No, character . does not need to be escaped
No, character / does not need to be escaped
No, character : does not need to be escaped
No, character = does not need to be escaped
No, character @ does not need to be escaped
No, character _ does not need to be escaped
Yes, character   needs to be escaped
Yes, character ! needs to be escaped
Yes, character " needs to be escaped
Yes, character # needs to be escaped
Yes, character $ needs to be escaped
Yes, character & needs to be escaped
Yes, character ' needs to be escaped
Yes, character ( needs to be escaped
Yes, character ) needs to be escaped
Yes, character * needs to be escaped
Yes, character , needs to be escaped
Yes, character ; needs to be escaped
Yes, character < needs to be escaped
Yes, character > needs to be escaped
Yes, character ? needs to be escaped
Yes, character [ needs to be escaped
Yes, character \ needs to be escaped
Yes, character ] needs to be escaped
Yes, character ^ needs to be escaped
Yes, character ` needs to be escaped
Yes, character { needs to be escaped
Yes, character | needs to be escaped
Yes, character } needs to be escaped

나올 수도 있어요.,@을 받는같습니다.@CharlesDuffy @CharlesDuffy 。

본 포식스에, 「Bash」에서 하는 것은 「Bash」입니다.shell배쉬에서 탈출해야 합니다.

좋은 일반적인 규칙은 "의심스럽다면 탈출하라"는 것이다. 몇몇 은 그들에게 합니다.\n에 리스트 되어 있습니다.man bash「 」의 Quoting ★★★★★★★★★★★★★★★★★」echo.

그 이외에는 영숫자가 아닌 문자는 이스케이프하는 것이 안전합니다.확실한 리스트는 하나도 몰라요

맨 페이지에는 모두 어디엔가 나와 있지만 한 군데군데 다 나와있어언어를 배워라, 그것이 확실한 방법이다.

은 를를 one one one이다.!이것은 Bash(및 csh)에서는 특수문자(이력확장)이지만 Korn 쉘에서는 그렇지 않습니다. 지어도.echo "Hello world!"문제가 생깁니다.통상대로 단일 따옴표를 사용하면 특별한 의미가 없어집니다.

배쉬 스트링에 대해서 말씀하시는 것 같네요.이스케이프에는 여러 가지 요건이 있는 문자열의 종류가 있습니다.예를 들어, 작은따옴표 문자열은 큰따옴표 문자열과 다릅니다.

가장 좋은 참조는 bash 매뉴얼의 견적 섹션입니다.

어떤 캐릭터가 탈출을 필요로 하는지 설명합니다.이력 전개 등, 유효하게 되어 있는 옵션에 따라서는, 일부의 문자를 이스케이프 할 필요가 있는 경우가 있습니다.

자동 완성을 사용하면 bash가 자동으로 일부 문자를 이스케이프하는 것을 알 수 있습니다.

를 들어, "Directory" ( 이름)이 dir:A 는 로 됩니다.bash 는 bash 로 자동 완료됩니다.dir\:A

이를 사용하여 ASCII 표의 문자를 사용하여 몇 가지 실험을 실행하여 다음 목록을 도출했습니다.

자동 완성 시 bash가 이스케이프하는 문자: (스페이스 포함)

 !"$&'()*,:;<=>?@[\]^`{|}

bash가 이스케이프하지 않는 문자:

#%+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~

했습니다./디렉토리명에서는 사용할 수 없기 때문에)

언급URL : https://stackoverflow.com/questions/15783701/which-characters-need-to-be-escaped-when-using-bash

반응형