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

本文介绍了解决Shell脚本中变量匹配错误的问题,详细分析了如何正确使用变量${wifistate}

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

#! /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系统中,如果在运行脚本提示 `echo: command not found`,这通常不是因为 `echo` 命令本身缺失,而是脚本执行环境或脚本本身的编写方式存在问题。以下是一些可能的原因及对应的解决方法: ### 1. 脚本使用了错误的解释器 确保脚本的第一行指定了正确的解释器,例如 `/bin/sh` 或 `/bin/bash`。如果脚本使用了其他解释器,如 `#!/usr/bin/env python`,但脚本内容实际上是 shell 命令,这会导致 `echo` 等命令无法识别。确保脚本的第一行如下所示: ```bash #!/bin/bash ``` 如果脚本使用的是 `/bin/sh`,但系统中 `sh` 指向的是其他 shell(如 `dash`),也可能导致兼容性问题。可以通过以下命令检查 `sh` 的实际链接: ```bash ls -l /bin/sh ``` 如果需要,可以将其更改为指向 `bash`: ```bash sudo ln -sf /bin/bash /bin/sh ``` ### 2. 脚本文件的编码或格式问题 如果脚本文件的编码或格式不正确,例如使用了 Windows 风格的换行符(`\r\n`),可能会导致 shell 解释器无法正确解析命令。可以使用 `dos2unix` 工具将文件转换为 Unix 风格的换行符: ```bash sudo apt-get install dos2unix dos2unix your_script.sh ``` ### 3. 脚本文件的执行权限不足 确保脚本文件具有执行权限。可以使用 `chmod` 命令为其添加执行权限: ```bash chmod +x your_script.sh ``` 然后尝试运行脚本: ```bash ./your_script.sh ``` ### 4. 环境变量问题 在某些情况下,脚本可能在非交互式 shell 中运行,导致环境变量未正确设置。可以在脚本的开头显式设置 `PATH`,以确保命令可以被正确找到: ```bash #!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin echo "Hello, World!" ``` ### 5. 使用 `source` 或 `.` 命令执行脚本 如果不想修改脚本执行权限,可以使用 `source` 或 `.` 命令来运行脚本: ```bash source your_script.sh ``` 或者 ```bash . your_script.sh ``` ### 6. 检查脚本中的特殊字符或语法错误 如果脚本中包含了 shell 无法识别的特殊字符或语法错误,也可能导致 `echo` 命令无法执行。可以使用 `set -x` 或 `bash -x` 来调试脚本,查看具体的执行过程: ```bash bash -x your_script.sh ``` ### 7. 系统环境问题 如果系统环境异常,例如 `/bin` 或 `/usr/bin` 目录被误删或损坏,也可能导致 `echo` 等基本命令缺失。可以通过重新安装 `coreutils` 包来修复: ```bash sudo apt-get update sudo apt-get install --reinstall coreutils ``` ### 总结 通过检查脚本的解释器、文件格式、执行权限、环境变量以及系统环境,通常可以解决 `echo: command not found` 的问题。如果问题仍然存在,建议逐步调试脚本,确保每一步都没有语法或逻辑错误
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值