bash脚本总结1:[[:not found 错误

运行shell脚本经常碰到这个坑,但是又不知道是怎么回事,总是怀疑bash版本是不是支持[[ 用法。

1.检查bash版本。

bash --vserion

GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

想来基本不是版本问题。

2.[[ 使用错误。

在交互模式下使用:


xiaobai@XXX:~$ [[ 1 ]] && echo ‘successful!‘

successful!

显然这样用是可以的。

3.那到底是哪里出了问题呢?

使用方式来讲,一般使用 sh XX.sh 或者 ./XX.sh ,尝试一下./ 执行,果然成功。那问题的结症找到,

但是交互和脚本之间的差距在于#!/bin/bash——指定环境变量。那具体是什么原因呢?


xiaobai@XXX:~$ ls -hl /bin | grep sh     

-rwxr-xr-x 1 root root 998K Oct  8  2014 bash

-rwxr-xr-x 1 root root 119K Feb 19  2014 dash

lrwxrwxrwx 1 root root    4 Dec 30 00:59 rbash -> bash

lrwxrwxrwx 1 root root    4 Dec 30 00:59 sh -> dash

lrwxrwxrwx 1 root root    4 Dec 30 00:59 sh.distrib -> dash

lrwxrwxrwx 1 root root    7 Nov 15  2013 static-sh -> busybox

原来是ubuntu 的sh指向的dash、并不是环境变量指定的bash,所以说./ 是可以的。sh 方式执行不行,那么显而易见的是 bash XX.SH 也可以但是我们并不会经常用的。

4. 接下去的问题就是dash 和 bash 有什么区别?

网上查了一下,ubuntu在6.10版本以后把系统默认的shell 改成了dash ,来自官方:dash(the Debian Almquist shell)是一个比bash小很多但仍兼容POSIX标准的shell,它占用的磁盘空间更少,执行shell脚本比bash更快,依赖的库文件更少,当然,在功能上无法与bash相比。dash来自于NetBSD版本的Almquist Shell(ash)。Ubuntu中将默认shell改为dash的主要原因是效率。由于Ubuntu启动过程中需要启动大量的shell脚本,为了优化启动速度和资源使用情况,Ubuntu做了这样的改动。

5.将dash修改为bash的方法。

sudo dpkg-reconfigure dash

选择no ,check。

需要注意的是,这样修改将会影响到系统的启动速度,甚至会影响到一些 依赖于dash独有特性的脚本(这些特性bash没有提供)。具体影响在哪里还在研究中。

时间: 2024-10-11 14:04:26

bash脚本总结1:[[:not found 错误的相关文章

bash脚本中出现[[:not found错误的解决方法

bash脚本中出现[[:not found错误的解决方法--bash脚本总结1 今天在写脚本的时候,发生了一个奇怪的问题:在脚本中使用[[的时候报错“[[: not found”.遇到问题自然是解决问题. 1. 使用的bash版本太低? bash --version查看bash版本信息如下 [email protected]:~$bash --version GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu) Copyright (C)

Bash脚本的空格和“期待一元表达式”错误

很少自己写Bash脚本,一写就出现了一些奇怪的问题,主要还是对Bash脚本的语法不够熟悉,毕竟很少使用. 当做记录一下吧,今天因为空格导致的一些脚本问题: 1.Bash脚本中的赋值符号"="前后不能有空格.例如给变量number赋值要写成"number=1",不能写成"number = 1".大多数编程语言都会忽略掉一些没有意义的空格,例如对于Java语言上面两种写法在语法上都是正确,但是Bash脚本不会. 2.Bash脚本中的"[&q

Linux应用环境实战10:Bash脚本编程语言中的美学与哲学(转)

阅读目录 一.一切皆是字符串 二.引用和元字符 三.字符串从哪里来.到哪里去 四.再加上一点点的定义,就可以推导出整个Bash脚本语言的语法了 五.输入输出重定向 六.Bash脚本语言的美学:大道至简 总结: 我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨Bash脚本语言中的美学与哲学. 这不是一篇Bash脚本编程的教程,但是却能让人更加深入地了解Bash脚本编程,更加快速地学习Bash脚本编程. 阅读这篇随笔,不需要你有Bash编程的经验,但一定要和我一

bash脚本编程之条件判断、条件测试

脚本编程: 编程面向过程有如下几种执行方式 顺序执行 选择执行:  如 if, case 循环执行:  如 for, while, until bash的变量类型: 本地变量 set VAR_NAME=value 设置变量赋值 如: set User=Centos unset VAR_NAME 撤消变量赋值 如: unset User=Centos ${VAR_NAME} 作用范围:当前shell进程: 局部变量 local VAR_NAME=value 设置变量赋值 unset VAR_NAM

回忆曾经写过的第一个Bash脚本

这盘文章,算是杂谈吧,想谈谈我对于Linux操作系统的灵魂之笔 Bash的理解. 据说Shell脚本有50种之多(陈皓老师的酷壳网上有一篇博文 http://coolshell.cn/articles/8619.html 提到),现在,用Linux调试大大小小程序,除了使用Makefile,偶尔用用CMakeList.txt, 更多程序是用bash 脚本来实现半自动化调试,就像在VS下面,每次修改重新编译一样,你总是 gcc 或者 g++,然后 ./test 运行,然后再看看有没有错,编译出错又

Bash脚本练习(一)(欢迎提意见,共同学习)

#!/bin/bash #写一个脚本(前提:请为虚拟机新增一块硬盘,假设它为/dev/sdb),为指定的硬盘创建分区: #1.列出当前系统上所有的磁盘,让用户选择,如果选择quit则退出脚本:如果用户选择错误,就让用户重新选择: #2.当用户选择后,提醒用户确认接下来的操作可能会损坏数据,并请用户确认:如果用户选择y就继续,n就退出:否则,让用户重新选择: #3.判断当前磁盘是否挂载使用,如使用,先卸载: #4.抹除那块硬盘上的所有分区(提示,抹除所有分区后执行sync命令,并让脚本睡眠3秒钟后

bash脚本编程之用户交互

bash脚本编程之用户交互: read [option]... [name ...] -p 'PROMPT'    读取输入的内容 -t TIMEOUT    超时时间,如果超过了该时间,继续执行下面代码 bash -n /path/to/some_script 检测脚本中的语法错误 bash -x /path/to/some_script 调试执行 示例: 输入一个磁盘文件信息,使用fdisk -l显示该磁盘信息 #!/bin/bash read -p "Enter a disk specia

Linux基础之bash脚本编程初级-逻辑运算与测试

引言 前面介绍了bash编程的基础变量与算术表达式,本文介绍在脚本中的进阶知识:测试 在bash中测试大体分两部分:条件测试.组合测试. 而条件测试有分:数值测试.字符串测试.文件测试. 组合测试则有两种表达方式.具体是什么表达方式在文章中会有具体展示. 本文实验环境为CentOS7.2 Linux中为什么要学习测试(判断)? 当我第一次学习这部分内容时,觉得好难,好不爽.可是这又是想要继续学习Linux必须要掌握的知识点.为什么?我们在生活中面对各种选择时总要问问自己,我是否应该怎样,不这样会

菜鸟的Linux之路2 bash脚本编程之一

shell脚本编程 脚本编程是一种编程能力的体现. 编程语言分为以下几类: 1,机器语言 2,汇编语言 3,高级语言: (1)静态语言:编译型语言->强类型语言 强类型语言指的是变量的类型在程序执行前声明好,不能在程序执行过程中随意改变变量类型的语言. 强类型语言常见的有:C.C++.Java.C#等. 编译型语言在程序执行前会依靠编译器将程序全部转换成可执行的二进制格式. 编译型语言需要事先确定好变量类型,因为它没有解释器,解释器的机制可以帮助程序自动声明变量的类型. 强类型的语言,变量在使用

Bash脚本15分钟进阶教程

这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT).这里是一个修订和扩增版本. 脚本安全 我的所有bash脚本都以下面几句为开场白: #!/bin/bashset-o nounsetset-o errexit 这样做会避免两种常见的问题: 引用未定义的变量(缺省值为“”) 执行失败的命令被忽略 需要注意的是,有些Linux命令的某些参数可以强制忽略发生的错误,例如“mkdir -p” 和 “rm -f”. 还要注意的是,在“errexit”模式下,虽然能有