`

Ubuntu下运行Shell脚本提示"declare not found"的问题

阅读更多
<meta http-equiv="content-type" content="text/html; charset=utf-8">

此种问题只在 Ubuntu 下才会出现!安装 debian 系统根本不存在此类问题,因为只有Ubuntu 把默认的 bash 替换成了 dash.

在学习 Shell 脚本的时候,有两个例子在运行时出现异常。比如,我在 test-dash.sh脚本输入如下内容: 
echo -e "Trekshot. \a \n" 
declare -i number=7 
echo $number 
在 Ubuntu 系统下使用 sh test-bash.sh 运行将出现如下提示信息: 
-e Trekshot. 
test-dash.sh: 2: declare: not found: 

有两个问题: 
a. echo 的参数 '-e' 怎么也打印出来了? 
b. 一个简单的整数声明语句为何提示 "declare: not found"? 

1.出现此问题的原因并非代码本身有误,而是 Ubuntu 系统的问题。我们在编写脚本时,第一行经常要写这么一行内容:#!/bin/bash. 这是对该脚本所使用的 shell 进行声明,因为Linux 上的 shell 并非只有一种,而各个 shell 的语法是由差别的。之所以把 echo 命令的参数误打出来,就是因为 sh 命令没有理解该语法,即当前使用的并不是 bash.下面来证明: 
获取 /bin 中相关文件的属性: 
-rwxr-xr-x 1 root root 725136 2008-05-13 02:48 bash 
-rwxr-xr-x 1 root root 87924 2008-06-21 00:07 dash 
lrwxrwxrwx 1 root root 4 2010-03-25 14:29 sh -> dash 

这表明在执行 sh test-dash.sh 的时候,我们使用的是一个叫 "dash" 的命令(注意 sh实为链接文件),而并不是脚本第一行中声明的 bash. 这就是上面现象的原因。 其实,如果使用 bash test-dash.sh 命令执行的话,上面两个错误根本不会出现。 

2.dash(Debian Almquist SHell) Ubuntu 自 6.10 后,将先前的 bashshell 更换成了dash (有待考证). 在设置 dash 的说明中有下面文字: 

The default /bin/sh shell on Debian and Debian-based systems is bash. 

However, since the default shell is required to be POSIX-compliant, any 
shell that conforms to POSIX, such as dash, can serve as /bin/sh. You may 
wish to do this because dash is faster and smaller than bash. 

大致意思是说默认的 shell 是 bash shell, 但只要是能兼容 POSIX 的 shell 都可以,而dash 比 bash 速度更快、更小巧,因此 Ubuntu 安装了 dash. 

3.怎么能把 dash 去掉而使用默认的 bash?使用如下命令: 
sudo dpkg-reconfigure dash 
此命令是对已安装的包进行重新配置,在菜单(dash-bash-sh.png)中选择是否将 sh 链接到 dash (Install dash as /bin/sh?) 选择否即可。 

附图一:Ubuntu 下设置 dash 界面

ubuntu 设置 dash - 烈火网

分享到:
评论

相关推荐

    Shell脚本中执行sql语句操作mysql的5种方法

    主要介绍了Shell脚本中执行sql语句操作mysql的5种方法,本文讲解了将SQL语句直接嵌入到shell脚本文件中、命令行调用单独的SQL文件、使用管道符调用SQL文件等方法,需要的朋友可以参考下

    大致介绍Ubuntu declare使用问题.docx

    大致介绍Ubuntu declare使用问题.docx

    Linux运维-3.Shell编程-11shell基础-117declare声明变量类型.avi

    Linux运维-3.Shell编程-11shell基础-117declare声明变量类型.avi

    跟老男孩学Linux运维:Shell编程实战

    Shell脚本初步入门 / 62.1 什么是Shell / 62.2 什么是Shell脚本 / 72.3 Shell脚本在Linux运维工作中的地位 / 82.4 脚本语言的种类 / 92.5 常用操作系统默认的Shell / 112.6 Shell脚本的建立和执行 / 12第3章 ...

    Shell脚本读取标准ini配置文件Demo

    主要介绍了Shell脚本读取标准ini配置文件Demo,本文直接给出代码实例,需要的朋友可以参考下

    Ubuntu环境下编译运行OpenCV程序cmake-gui生成可执行文件

    /**cmake-gui:生成可执行文件**/ step1:建立文件夹包含代码和处理图片 step2:添加cmake编译需要的文件 CMmakeLists.txt 找到下面两行更改(注:这个文件可以在OpenCV源代码解压出来的文件夹下的/samples/c/example...

    学习shell必备(CN).chm

    33.10. Windows下的shell脚本 34. Bash, 版本2与版本3 34.1. Bash, 版本2 34.2. Bash, 版本3 35. 后记 35.1. 作者后记 35.2. 关于作者 35.3. 译者后记 35.3.1. 杨春敏 35.3.2. 黄毅 35.4. 在哪里可以获得帮助 35.5. ...

    高级Bash脚本编程指南.pdf

    Windows下的shell脚本 34. Bash, 版本2与版本3 34.1. Bash, 版本2 34.2. Bash, 版本3 35. 后记 35.1. 作者后记 35.2. 关于作者 35.3. 译者后记 35.3.1. 杨春敏 35.3.2. 黄毅 35.4. 在哪里可以获得...

    编写一个弹出式菜单的shell程序 实现以下五个操作

    #!/bin/sh echo "******************************************************************" echo " * MENU *" ...declare -i i=1 while [ $i -eq 1 ] do echo "Please input a number(1-5):" read num case $num in

    LinuxShell编程

    Linux Shell编程基础知识 目 录1、 Shell简介1.1. 什么是shell1.2. shell分类2、 Shell语法... Shell脚本文件的参数2.5.4. 函数的参数2.6. 类型变量2.6.1. declare 声明类型变量2.7. Shell文件中的交互功能2.8. 转义(\)

    学习笔记---《shell从入门到精髓》张春晓

    反引号(``)键盘1左边,作为shell命令执行。()也有这个作用【相当于在此处插入新的shell,此处会被新的shell的echo内容全部替换】 \(转义字符)---特殊字符转为普通字符 5,默认情况下,所有的变量都是全局变量!...

    shell算数运算

    算术运算UNIX shell范例精解。整数运算(declare和let命令) declare命令 可以用declare –i命令定义整型变量。如果给整型变量赋一个字符串值,则bash将把变量赋值为0。可以对已定义的整型变量执行算术运算(如果变量未...

    高级bash脚本编程指南(中英文合集)

    33.10. 在Windows 下进行Shell 编程 34. Bash, 版本 2 和 3 34.1. Bash, 版本2 34.2. Bash, 版本3 35. 后记 35.1. 作者后记 35.2. 关于作者 35.3. 哪里可以取得帮助? 35.4. 制作这本书的工具 35.4.1. 硬件 ...

    shell脚本编程之数组

    shell支持稀疏数组,下标整数不需要连续。 声明方式:declare -a 数组名 2、关联数组 关联数组可以使用任意的字符串作为下标(不必是整数)来访问数组元素。bash4.0开始支持关联数组。 格式:数组名[任意

    Linux declare命令用法详解

    若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。 语法declare [+/-][rxi][变量名称=设置值] 或 declare -f 参数说明: +/- ”-“可用来指定变量的属性,”+”则是取消变量所设的属性...

    Shell脚本读取ini配置文件的实现代码2例

    一、简单版 参考stackoverflow的例子,改了一个出来: 代码如下: while IFS=’= ‘ read var val do  if [[ $var == \[*] ]]  then  section=$(echo $var | sed ‘s/^\[\(.*\)\]$/\1/’) ... declare “${section

    详解shell 变量

    1.简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要...当然,如果有必要,你也可以使用declare/typeset Shell内建命令显式定义变量的类型,但在一般情况下没

    qt自定义类型 Q_DECLARE_METATYPE与qRegisterMetaType

    如果要使自定义类型或其他非QMetaType内置类型在QVaiant中使用,必须使用该宏Q_DECLARE_METATYPE。 该类型必须有公有的 构造、析构、复制构造 函数 qRegisterMetaType 必须使用该函数的两种情况:1、如果非QMetaType...

    SQL Server 数据库日常维护脚本 合集

    SQL Server 数据库日常维护脚本 合集 --备份 declare @sql varchar(8000) set @sql='backup database mis to disk=''d:\databack\mis\mis' +rtrim(convert(varchar,getdate(),112))+'.bak''' exec(@sql) --删除...

    自定义控件控件的declare-styleable配置

    最近在模仿今日头条,发现它的很多属性都是通过自定义控件并设定相关的配置属性进行配置,于是便查询了解了下declare-styleable,下面我把自己的使用感受和如何使用进行说明下。 declare-styleable:declare-...

Global site tag (gtag.js) - Google Analytics