định dạng có thể được sử dụng lại làm đầu vào shell
Có một định dạng đặc biệt printf chỉ thị ( %q) được xây dựng cho loại yêu cầu này:
định dạng printf [-v var] [đối số]
%q causes printf to output the corresponding argument
in a format that can be reused as shell input.
Một số mẫu:
read foo
Hello world
printf "%q\n" "$foo"
Hello\ world
printf "%q\n" $'Hello world!\n'
$'Hello world!\n'
Điều này cũng có thể được sử dụng thông qua các biến:
printf -v var "%q" "$foo
"
echo "$var"
$'Hello world\n'
Kiểm tra nhanh với tất cả (128) byte ascii:
Lưu ý rằng tất cả các byte từ 128 đến 255 phải được thoát.
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
Điều này phải hiển thị một cái gì đó như:
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
Trong đó trường thứ nhất là giá trị hexa của byte, trường thứ hai chứa Enếu ký tự cần được thoát và trường thứ ba hiển thị thoát trình bày ký tự.
Tại sao ,?
Bạn có thể thấy một số nhân vật không cần phải luôn luôn trốn thoát, như ,, }và {.
Vì vậy, không phải luôn luôn nhưng đôi khi :
echo test 1, 2, 3 and 4,5.
test 1, 2, 3 and 4,5.
hoặc là
echo test { 1, 2, 3 }
test { 1, 2, 3 }
nhưng quan tâm:
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