Linux shell脚本执行提示错误[[: not found
2015-09-17 15:17
435 查看
在脚本中实现在一个字符串中查找一个子串
以上的程序在命令行中一行一行输入,没有问题。可放在脚本中,执行脚本./myscritp,就会出现以下错误提示:
[[: not found…………………..
……………………………………..
Display all 2161 possibilities? (y or n)
…………………………………………….
在命令行中按上下键查看前几条指令,发现有几条指令被打乱了,那些语句好像被胡乱的切割成几条命令。原因是在一行行输入时,$wifistate是没有歧义的,放在脚本中,$后面跟随的一串字符,shell不知道怎样截取,应该把\$wifistate改为\${wifistate},上面代码修改为:
修改后执行,依然有错误:
[[: not found…………………..
可是在命令行的交互模式下没有错误,这说明脚本中的命令本身没有问题,很可能出在运行环节上。脚本中还有一句是#! /bin/sh,指定运行该脚本所使用的shell类型,这里使用sh来解释语句,那么试试更换成bash来执行,将执行语句换成
#bash myscript
就没有再出现上述错误了。所以原因就是sh不支持[[这样的扩展,bash支持[[扩展。可以将脚本中的#! /bin/sh改成#! /bin/bash再#./ myscript也是一样。
补充说明:
sh只是一个符号链接,最终指向是一个叫做dash的程序,自Ubuntu 6.10以后,系统的默认shell /bin/sh被改成了dash。dash(the Debian Almquist shell) 是一个比bash小很多但仍兼容POSIX标准的shell,它占用的磁盘空间更少,执行shell脚本比bash更快,依赖的库文件更少,当然,在功能上无法与bash相比。dash来自于NetBSD版本的Almquist Shell(ash)。
Ubuntu中将默认shell改为dash的主要原因是效率。由于Ubuntu启动过程中需要启动大量的shell脚本,为了优化启动速度和资源使用情况,Ubuntu做了这样的改动。
关于sh,bash,./ 见:
http://it.chinawin.net/os/article-8112.html
#! /bin/sh #myscript wifistate=$(iwconfig wlan0) if [[ "$wifistate" =~ "unassociated" ]];then echo no elif [[ "$wifistate" =~ "associated" ]];then echo yes else echo hello fi
以上的程序在命令行中一行一行输入,没有问题。可放在脚本中,执行脚本./myscritp,就会出现以下错误提示:
[[: not found…………………..
……………………………………..
Display all 2161 possibilities? (y or n)
…………………………………………….
在命令行中按上下键查看前几条指令,发现有几条指令被打乱了,那些语句好像被胡乱的切割成几条命令。原因是在一行行输入时,$wifistate是没有歧义的,放在脚本中,$后面跟随的一串字符,shell不知道怎样截取,应该把\$wifistate改为\${wifistate},上面代码修改为:
#! /bin/sh wifistate=$(iwconfig wlan0) if [[ "${wifistate}" =~ "unassociated" ]];then echo no elif [[ "{$wifistate}" =~ "associated" ]];then echo yes else echo hello fi
修改后执行,依然有错误:
[[: not found…………………..
可是在命令行的交互模式下没有错误,这说明脚本中的命令本身没有问题,很可能出在运行环节上。脚本中还有一句是#! /bin/sh,指定运行该脚本所使用的shell类型,这里使用sh来解释语句,那么试试更换成bash来执行,将执行语句换成
#bash myscript
就没有再出现上述错误了。所以原因就是sh不支持[[这样的扩展,bash支持[[扩展。可以将脚本中的#! /bin/sh改成#! /bin/bash再#./ myscript也是一样。
补充说明:
sh只是一个符号链接,最终指向是一个叫做dash的程序,自Ubuntu 6.10以后,系统的默认shell /bin/sh被改成了dash。dash(the Debian Almquist shell) 是一个比bash小很多但仍兼容POSIX标准的shell,它占用的磁盘空间更少,执行shell脚本比bash更快,依赖的库文件更少,当然,在功能上无法与bash相比。dash来自于NetBSD版本的Almquist Shell(ash)。
Ubuntu中将默认shell改为dash的主要原因是效率。由于Ubuntu启动过程中需要启动大量的shell脚本,为了优化启动速度和资源使用情况,Ubuntu做了这样的改动。
关于sh,bash,./ 见:
http://it.chinawin.net/os/article-8112.html
相关文章推荐
- Linux shell(1)
- linux insufficient permissions for device(解决adb shell问题)
- 你可能不知道的Shell
- linux shell软链接的问题
- shell脚本基础进阶(一)----shell介绍
- shell计算工具源码
- L7 linux shell编程练习
- shell 为变量赋值 命令的输出结果赋值
- L7.3 linux shell 循环语句总结
- linux shell必知必会sed、awk
- Bash Shell 重定向(二):中文解释
- Bash Shell 重定向(一):原文
- Android自动化测试shell脚本(飞车Asphalt5)
- Shell脚本中获取本机ip地址的3个方法
- android 常用adb 和 adb shell 命令
- linux shell之sed
- shell脚本
- mysql自动备份、恢复脚本(linux的shell、windows的批处理)
- shell基础(二)
- Linux学习之bash总结(持续进行中….)