Ubuntu默认dash带来的问题
前述
在这篇文章开始之前,如果不知道什么是dash或者dash与bash的区别是什么,我们可以先轻松的浏览一下小编的前一篇文章,小编不敢保证我们看了之后就对bash、dash了解透彻,但是小编认为阅后对bash和dash有一个清晰的认识是完全没问题的!
这里呈上文章:https://blog.csdn.net/weixin_39212776/article/details/81079727
问题的重述
相信很多朋友在Ubuntu高版本的环境下啃《鸟哥的Linux私房菜》的时候都会觉得有这样一些疑惑:为什么我的shell脚本和鸟哥的一样,为什么我的会报错呢?然后经过一番了解之后我们会发现,我们使用的高版本Ubuntu的shell工具默认是dash,但是鸟哥的CentOS默认的是bash,也正是这个区别造成了我们的苦恼!
下面我们针对鸟哥书上的个别案例具体讲述一下上述两者的区别的所在,以及我们怎么解决或者是避免它:
鸟哥书的13章中的“利用判断符号[]” 的例子代码如下:
#!/bin/bash # 仔细看这里是bash
# Program:
# This Program shows the users's choice
# History:
# 2018/7/18 Richard First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input your choice (Y/N):" yn
[ "$yn" = "Y" -o "$yn" = "y" ] && echo "OK, continue" && exit 0
[ "$yn" = "N" -o "$yn" = "n" ] && echo "Oh, interrupt!" && exit 0
echo "I dont't know what your choice is" && exit 0
我们运行以上的例子看看:
root@Richard:~/scripts# sh sh06.sh
Please input your choice (Y/N):Y
sh06.sh: 10: [: Y: unexpected operator
sh06.sh: 11: [: Y: unexpected operator
I dont't know what your choice is
至此我们发现了问题,这便是上述的不同造成的,这一点我也不再赘述,下面我们的重点是在怎么解决它?如下。
问题的解决方案
我们知道脚本的第一行
#!/bin/bash
是指此脚本使用/bin/bash来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。
但是正如上面我们使用的sh 执行命令是符号链接到的dash解释工具,我们用dash去解释一个自身规定了要用bash执行的脚本,这固然会出错嘛!所以我们可以这样来解决:
- 方案一:第一行“#!/bin/bash“保持不变,只是在运行时我们调用bash去解释执行:
root@Richard:~/scripts# bash sh06.sh
Please input your choice (Y/N):y
OK, continue
这样就完美解决了!
- 方案二:将shell脚本开始的“#!/bin/bash”改为=>”#!/bin/dash“或“#!/bin/sh”,同时在将符号”[]”里的“==”改为=> “=” , 使用sh或dash命令运行即可:
#!/bin/sh
# Program:
# This Program shows the users's choice
# History:
# 2018/7/18 Richard First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input your choice (Y/N):" yn
[ "$yn" = "Y" -o "$yn" = "y" ] && echo "OK, continue" && exit 0 # 只有一个等号
[ "$yn" = "N" -o "$yn" = "n" ] && echo "Oh, interrupt!" && exit 0 # 只有一个等号
echo "I dont't know what your choice is" && exit 0
再按照习惯正常运行:
root@Richard:~/scripts# sh sh06.sh
Please input your choice (Y/N):y
OK, continue
上面我们关注到判断符号有原来的“==”变成了“=”,其实“等于”的判断在bash中使用“==”或“=”都是可以的,但是在dash中却规定了只有使用“=”才可以,所以我们原来使用“==”再调用dash去解释是会报错咯!
- 方案三:如果像上面一样解决,我们可能会觉得和鸟哥书上有所出入,我会不爽的,那么我们还有一个终极的办法,直接将高级Ubuntu默认的dash改为和鸟哥一样默认是bash,这样的我们在跟着鸟哥的书走就不会出类似的错了;我们在命令窗口直接输入”sudo dpkg-reconfigure dash“,像这样:
root@Richard:~/scripts# sudo dpkg-reconfigure dash
在弹出的窗口中选择 否 即可:
此后,我们的Ubuntu就是默认的bash执行了,如果想切换回来用dash我们再执行一遍上述命令,再选 是 就OK了
接下来我们就可以像鸟哥一样操作没问题了!尽情地遨游Linux的海洋吧!