Linux shell脚本执行提示错误[[: not found

在脚本中实现在一个字符串中查找一个子串

#! /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)
…………………………………………….
在命令行中按上下键查看前几条指令,发现有几条指令被打乱了,那些语句好像被胡乱的切割成几条命令。原因是在一行行输入时, w i f i s t a t e 是 没 有 歧 义 的 , 放 在 脚 本 中 , wifistate是没有歧义的,放在脚本中, 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做了这样的改动。
————————————————
版权声明:本文为CSDN博主「小猫的嵌入式」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lucykingljj/article/details/48519069

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值