쉘 입력으로 재사용 할 수있는 형식
이 특별 printf
형식 지시자 ( %q
요청 이런 종류의 내장은) :
printf [-v var] 형식 [인수]
%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