linux总结02-关于ubuntu中sh执行shell脚本报错问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dylloveyou/article/details/53393906

第02总结——关于ubuntu中sh执行shell脚本报错问题

参照《鸟哥的linux私房菜》书中写条件判断的例子:

  1. 当执行一个程序的时候,这个程序会让用户选择 Y 或 N
  2. 如果用户输入 Y 或 y 时,就显示『 OK, continue 』
  3. 如果用户输入 n 或 N 时,就显示『 Oh, interrupt ! 』
  4. 如果不是 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

不再报错

展开阅读全文

没有更多推荐了,返回首页