执行shell脚本中declare: not found

2024-03-14 21:18

本文主要是介绍执行shell脚本中declare: not found,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 


    在学习 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 界面

  

这篇关于执行shell脚本中declare: not found的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/809753

相关文章

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

Linux实现简易版Shell的代码详解

《Linux实现简易版Shell的代码详解》本篇文章,我们将一起踏上一段有趣的旅程,仿照CentOS–Bash的工作流程,实现一个功能虽然简单,但足以让你深刻理解Shell工作原理的迷你Sh... 目录一、程序流程分析二、代码实现1. 打印命令行提示符2. 获取用户输入的命令行3. 命令行解析4. 执行命令

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的