shell執行${var:m:n}報錯Bad substitution解決辦法
Ubuntu系統下,執行字元串截取腳本時,總是報錯:Bad substitution,腳本非常簡單如下:
#!/bin/sh str1="hello world!" echo ${str1:1:4}
執行後報錯:
.str1.sh:4:./str1.sh:Bad substituion
解決方法:
將解釋器調整為bash
#!/bin/bash
$sudo ./str1.sh
ello
原因是ubuntu的sh是連接指向dash的,而不是bash,自然在識別${str1:1:4}總是出問題。
Linux中的shell有多種類型,其中最常用的幾種是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。三種shell各有優缺點。Bourne shell是UNIX最初使用的shell,並且在每種UNIX上都可以使用。Bourne shell在shell編程方面相當優秀,但在處理與用戶的交互方面做得不如其他幾種shell。Linux作業系統預設的shell是Bourne Again shell,它是Bourne shell的擴展,簡稱Bash,與Bourne shell完全向後兼容,並且在Bourne shell的基礎上增加、增強了很多特性。Bash放在/bin/bash中,它有許多特色,可以提供如命令補全、命令編輯和命令歷史表等功能,它還包含了很多C shell和Korn shell中的優點,有靈活和強大的編程介面,同時又有很友好的用戶介面。
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。