linux shell脚本执行错误:bad substitution

脚本test.sh内容:

#!/bin/bash

read pressKey
indexes=0
c=${pressKey:indexes:1}
使用调试方式执行:sh -x test.sh第3行总出现bad substitution提示信息。
百思不得其解: 
于是百度,查到一条有用信息,这与linux shell使用的是/bin/sh,还是/bin/bash有关系。我的脚本中指定使用的是/bin/bash shell,但是我在调试的时候使用的是sh shell,因此调试时导致错误提示信息。
解决方法:
使用bash -x test.sh进行调试,则成功。
 
以下是引用的链接内容:
http://hi.baidu.com/wwkblog/item/c974569b9ee031aecd80e5fe

在linuxmint上执行如下脚本总是出错:

1
2
3
#!bin/sh
a="abcdefghijklmn"
echo ${a:2:7}

然后运行sh 1.sh总是报出bad substitutation

后来改成

1
2
3
#!bin/bash
a="abcdefghijklmn"
echo ${a:2:7}

然后执行 bash 1.sh 没有问题。

原因是ubuntu的sh是连接指向dash的,而不是bash,自然在识别${a:2:7}总是出问题。

   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。

 

posted on 2017-08-29 23:03  flyingwaters  阅读(24816)  评论(1编辑  收藏  举报

导航