問題現象
需要執行的腳本test.sh
echo "hello!"
name="tomes"
echo ${#name}
echo ${name:1:2}
執行該腳本報錯
./test.sh
hello!
5
./test.sh: 4: ./test.sh: Bad substitution
原因分析
#! 是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell。
#!/bin/sh
echo "Hello World !"
如上面的代碼則指定解釋器爲bash
而不指定解釋器,ubantu系統默認會指向解釋器/bin/sh 該sh指定的是dash,而不是bash。
而使用dash解釋器去執行echo ${name:1:2} 字符串截取則會出現問題
解決方法
shell腳本務必指定需要使用到的解釋器,如這裏指定bash作爲解釋器,能正常執行echo ${name:1:2} 字符串截取
#!/bin/bash
echo "hello!"
name="tomes"
echo ${#name}
echo ${name:1:2}
擴展
不同系統對默認解釋器或/bin/sh指向的解釋器可能存在差異
GNU/Linux 操作系統中的 /bin/sh 是 bash(Bourne-Again Shell)的符號鏈接,但鑑於 bash 過於複雜,有人把 ash 從 NetBSD 移植到 Linux 並更名爲 dash(Debian Almquist Shell),並建議將 /bin/sh 指向它,以獲得更快的腳本執行速度。Ubuntu 號稱自從他們在 6.10 版裏這樣做了以後,系統啓動速度有了明顯的提升。Debian 計劃在下一個發行版(代號 lenny)中也將 dash 作爲默認的 /bin/sh。