linux基础学习总结02

来源:互联网 发布:监控硬盘覆盖数据恢复 编辑:程序博客网 时间:2024/05/18 10:11

第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/bashread -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 0echo "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): yans_yn.sh: 8: [: y: unexpected operatorans_yn.sh: 9: [: y: unexpected operatorI don't know what your choise is

可以看到上面显示有报错

再用bash ans_yn.sh执行

ubuntu@kvm-test:~/bin$ bash ans_yn.sh Please input (Y/N): yOK,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/shlrwxrwxrwx 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/shsudo: unable to resolve host kvm-test[sudo] password for ubuntu: ubuntu@kvm-test:~/bin$ ls -al /bin/shlrwxrwxrwx 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): yOK,continue

不再报错

0 0
原创粉丝点击