[Linux] 使用 printf 來跳脫 shell 中的特殊字元

[Linux] 使用 printf 來跳脫 shell 中的特殊字元

最近被 Linux shell 裡面的跳脫字元 (escape) 的問題搞到快瘋掉了…

因為專案中用到很多的 shell script,然後一堆變數會在函式中互傳,

問題是如果變數中有包含一些特殊字元,可能就會讓程式爛掉…

 

舉例來說,下面有一個改密碼的小程式,

使用者輸入密碼之後,會先被存到 temp 變數中~

這動作基本上不會出錯,即使像我輸入了 $a[b]c”d’e 這類很容易踩到 shell 地雷線的值也沒問題~

echo -n “Input password: “
read temp

eval pass=$temp

echo $pass | passwd admin –stdin 

 

問題是中間的 eval 那行敘述…

(當然那行敘述看起來有點多餘,為什麼不直接 read 就指定給 temp 就好了?

不過因為這是簡化過的程式,原始程式中的 eval 是有必要的)

當執行到 eval 那行敘述時,就會出錯了~~ =_=

sh2

 

這邊就算你改成 eval pass=”$temp” 也是會錯的~

看起來是因為 temp 的內容被代換到 eval 敘述時,

裡面的變數如 $a 被展開,或是 ” 和 ‘ 這些字串結尾符號造成了混亂…

比較好的方法就是把 temp 的內容跳脫掉,才不會出問題…

 

在網路上找了一下,在這篇文章中找到了一個可以用的方式,

那就是利用 printf(“%q”) 可以幫忙加上跳脫字元,

因此 eval 那行敘述可以改成如下:

eval pass=$(printf “%q” $temp) 

 

 這樣子修改後,程式就可以接受任何的字元輸入囉~

sh1  

(本頁面已被瀏覽過 1,485 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料