第02总结——关于ubuntu中sh执行shell脚本报错问题
参照《鸟哥的linux私房菜》书中写条件判断的例子:
当执行一个程序的时候,这个程序会让用户选择 Y 或 N
如果用户输入 Y 或 y 时,就显示『 OK, continue 』
如果用户输入 n 或 N 时,就显示『 Oh, interrupt ! 』
如果不是 Y/y/N/n 之内的其他字符,就显示『 I don’t know what your choice is 』
所写脚本如下 ans_yn.sh:
#!/bin/bash
read -p "Please input (Y/N): " ynp
[ "${ynp}" == "Y" -o "${ynp}" == "y" ] && echo "OK,continue" && exit 0
[ "${ynp}" == "N" -o "${ynp}" == "n" ] && echo "Oh,interrupt!" && exit 0
echo "I don't know what your choise is" && exit 0
执行 sh ans_yn.sh
ubuntu@kvm-test:~/bin$ sh ans_yn.sh
Please input (Y/N): y
ans_yn.sh: 8: [: y: unexpected operator
ans_yn.sh: 9: [: y: unexpected operator
I don't know what your choise is
可以看到上面显示有报错
再用bash ans_yn.sh执行
ubuntu@kvm-test:~/bin$ bash ans_yn.sh
Please input (Y/N): y
OK,continue
正确执行。而且鸟哥的书中写道,对shell脚本可以以 bash 程序来执行:通过『 bash shell.sh 』或『 sh shell.sh 』来执行。那为何 『 sh shell.sh 』 也可以执行呢?这是因为 /bin/sh 其实就是 /bin/bash (链接), 使用 sh shell.sh亦即告诉系统,我想要直接以 bash 的功能来执行 shell.sh 这个文件内的相关指令的意思。
那就回到刚才的报错,sh执行报错,是不是因为/bin/sh的链接非/bin/bash
通过命令查看
ubuntu@kvm-test:~/bin$ ls -al /bin/sh
lrwxrwxrwx 1 root root 4 Sep 18 18:52 /bin/sh ->dash
果然,sh链接的是dash,而不是bash,所以造成执行结果不一样(一个报错,一个正常执行)
如果想把/bin/sh的链接改为bash,则可以执行下面的命令
ubuntu@kvm-test:~/bin$ sudo ln -sf /bin/bash /bin/sh
sudo: unable to resolve host kvm-test
[sudo] password for ubuntu:
ubuntu@kvm-test:~/bin$ ls -al /bin/sh
lrwxrwxrwx 1 root root 9 Nov 29 14:58 /bin/sh -> /bin/bash
再执行 sh ans_yn.sh
ubuntu@kvm-test:~/bin$ sh ans_yn.sh
Please input (Y/N): y
OK,continue
不再报错