[Linux] 使用 printf 來跳脫 shell 中的特殊字元
最近被 Linux shell 裡面的跳脫字元 (escape) 的問題搞到快瘋掉了…
因為專案中用到很多的 shell script,然後一堆變數會在函式中互傳,
問題是如果變數中有包含一些特殊字元,可能就會讓程式爛掉…
舉例來說,下面有一個改密碼的小程式,
使用者輸入密碼之後,會先被存到 temp 變數中~
這動作基本上不會出錯,即使像我輸入了 $a[b]c”d’e 這類很容易踩到 shell 地雷線的值也沒問題~
echo -n “Input password: “
read temp
read temp
eval pass=$temp
echo “$pass“ | passwd admin –stdin
問題是中間的 eval 那行敘述…
(當然那行敘述看起來有點多餘,為什麼不直接 read 就指定給 temp 就好了?
不過因為這是簡化過的程式,原始程式中的 eval 是有必要的)
當執行到 eval 那行敘述時,就會出錯了~~ =_=
這邊就算你改成 eval pass=”$temp” 也是會錯的~
看起來是因為 temp 的內容被代換到 eval 敘述時,
裡面的變數如 $a 被展開,或是 ” 和 ‘ 這些字串結尾符號造成了混亂…
比較好的方法就是把 temp 的內容跳脫掉,才不會出問題…
在網路上找了一下,在這篇文章中找到了一個可以用的方式,
那就是利用 printf(“%q”) 可以幫忙加上跳脫字元,
因此 eval 那行敘述可以改成如下:
eval pass=$(printf “%q” “$temp“)
這樣子修改後,程式就可以接受任何的字元輸入囉~
(本頁面已被瀏覽過 1,512 次)