`

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 脚本教程 ppt

    本教程主要针对Linux系统下的Shell脚本编程,适用于初学者。它不仅涵盖了基础概念,还深入探讨了Shell变量的管理和操作技巧,是理解并掌握Shell脚本编程的一个很好的起点。 #### 核心知识点详解 ##### Linux操作...

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

    test03-declare.sh: 5: declare: not found ``` 这是因为 sh 命令无法正确地解释 declare 命令,导致 declare 命令未被识别。 相比之下,如果我们使用 bash 命令来执行脚本,结果将是正确的: ```bash $ bash ...

    高级Shell脚本编程指南

    在信息技术领域,Shell脚本是一种强大的工具,它允许用户通过命令行接口自动化执行一系列操作。对于系统管理员、开发者以及任何需要处理日常任务的人来说,掌握高级Shell脚本编程技巧是至关重要的。本指南将深入探讨...

    Shell脚本专家指南

    《Shell脚本专家指南》是面向Linux环境下的脚本编程深度探索的一部专业书籍,它不仅为初学者提供了基础的Shell脚本入门指导,更为有经验的开发者提供了进阶技巧和实战案例,帮助读者掌握复杂脚本设计与优化,成为...

    shell脚本编程100例?_shell_Shell脚本100例_

    echo "File not found." fi ``` 其中`-f`是测试文件是否存在且为普通文件。 4. **循环结构**: `for`、`while`、`until`常用于重复执行任务。例如,遍历一个数组: ```bash for i in {1..10}; do echo "$i" ...

    <Linux>shell 脚本环境变量问题深层探索【实践+实验】

    Linux shell 脚本环境变量问题深层探索 shell 脚本环境变量是 Linux 系统中一个非常重要的概念,它对 shell 脚本的执行和调试产生了深远的影响。本文将深入探索 shell 脚本环境变量的问题,从实践和实验的角度来...

    6,Shell脚本基础

    Shell脚本由多条命令聚集在一个文件中,自上而下的执行文件的命令。下面是 Shell 脚本基础知识点的总结: Shell脚本基础概念 * Shell脚本是一种脚本语言,用于自动化系统管理和操作任务。 * Shell脚本是将多条命令...

    shell脚本初级入门

    shell脚本初级入门 shell脚本是一种非常强大且灵活的自动化工具,广泛应用于Linux和Unix系统中。通过学习shell脚本,可以自动化许多重复性的工作,提高工作效率和生产力。本文将从基本语法开始,逐步引导读者学习...

    oracle数据库调用shell脚本全套

    Oracle数据库提供了一个内置的PL/SQL包DBMS_SCHEDULER,可以用来执行操作系统级别的任务,包括运行Shell脚本。以下是一个简单的例子: ```sql DECLARE job_name VARCHAR2(100) := 'MY_SHELL_JOB'; BEGIN DBMS_...

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

    这种需求下,掌握在Shell脚本中执行SQL语句的方法显得尤为重要。本文将详细介绍五种常见的方法,并提供具体的示例,帮助读者更好地理解和应用。 #### 二、直接将SQL语句嵌入Shell脚本 这种方法是最直观的实现方式之...

    Linux之shell脚本基础详细教程大全-shell脚本基础1-变量.docx

    在Linux系统中,Shell脚本是一种强大的自动化工具,它允许用户编写一系列命令,以执行复杂的任务。本教程主要关注Shell脚本的基础知识,特别是变量的使用。变量在Shell脚本中扮演着至关重要的角色,它们可以存储数据...

    shell脚本语法

    **Shell脚本**是一种用于自动化执行Linux或Unix系统中的任务的脚本语言。通过编写Shell脚本,用户可以组合多个命令来完成复杂的操作,提高工作效率。Shell脚本的基础包括变量、流程控制、函数等。 #### 二、Shell...

    Linux shell脚本全面学习

    它是Bourne Shell(bash)的一个扩展,提供了一种编程环境,允许用户通过命令行接口编写可执行的脚本来执行一系列操作。全面学习Linux Shell脚本,将使你能够更高效地管理Linux系统,提高工作效率。 一、Shell脚本...

    shell编程,显示奇数位置参数

    3. **数组操作**:在Shell脚本中,可以使用`declare -a`声明数组,并通过索引进行元素的读取和修改。 #### 知识点三:判断奇数位置参数并输出 1. **变量初始化**:初始化计数器`j`为0,用于追踪当前处理的位置参数...

    Linux运维- Shell脚本自动化编程实战-第08章Shell内置命令(2集).zip

    在Linux系统中,Shell脚本是自动化运维的重要工具,它允许我们编写一系列命令来执行复杂的任务,节省时间和提高效率。本章重点讲解的是Shell的内置命令,这些命令直接由Shell解释器执行,无需调用外部程序,从而提高...

    shell-script.zip

    在Shell脚本学习中,README文件可能会提供关于示例脚本的目的、如何运行它们以及可能遇到的问题等信息。 2. **shell_args**: 这个文件可能是关于处理命令行参数的示例。在Shell脚本中,我们可以使用`$1`, `$2`, `$3...

Global site tag (gtag.js) - Google Analytics