shell腳本字符串截取 Bad substitution

問題現象

需要執行的腳本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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章