shell執行${var:m:n}報錯Bad substitution解決辦法

Ubuntu系統下,執行字元串截取腳本時,總是報錯:Bad substitution,腳本非常簡單如下:

#!/bin/sh
str1="hello world!"
echo ${str1:1:4}

執行後報錯:

.str1.sh4:./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。

Tags: