centos及redhat默认使用的是bash shll,那么怎么查看当前系统使用的是哪种shell脚本呢,通过以下方法获取:
(1)
[root@YZC ~]# echo $SHELL /bin/bash
(2)
[root@YZC ~]# head -1 /etc/passwd root:x:0:0:root:/root:/bin/bash
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Shell脚本的执行
当脚本非交互式执行时,它会先查找环境变量ENV,该变量指定了以个环境变量(通常是.bashrc),然后从环境变量开始执行,当读取了ENV文件后,Shell才开始执行Shell脚本中的内容。
Shell脚本的执行通常有以下三种方式:
①bash script-name或sh script-name
②path/script-name或./script-name(当前路径下执行脚本)
③source script-name或. script-name
执行说明:
第一种方法是当脚本文件本身没有可执行权限时常用的方法;
第二种方法需要将脚本文件的权限改为可执行权限(chmod +x script-name),然后通过脚本路径就可以直接执行了;
生产环境中不少工程师在写完shell脚本后,由于疏忽而忘记给与该脚本的执行权限,直接就应用了,结果导致脚本没有按照自己的意愿手动或定时执行,所以一般都推荐采用第一种方法。
第三种方法通常是使用source或者"."点号读入或加载指定的shell脚本(son.sh),然后,依次执行指定shell脚本文件son.sh中的所有语句。这些语句将作为当前父shell脚本fathe.sh进程的一部分运行,因此使用source或者"."点号可以将son.sh自身脚本中的变量的值或函数等的返回值传递给当前的父shell脚本father.sh中使用。这是第三种方法和前两种方法最大的区别。
source或者"."点号命令的功能是在当前shell中执行source或者"."点号加载并执行的相关脚本文件中的命令及语句,而不是产生一个子shell来执行命令文件中的命令。
示例:
第一种方法:
[root@YZC ~]# cat >test.sh #->cat命令可以查看也可以编辑文件; echo 'my machine name is YZC' #->按ctrl+d或+c保存文件 ; [root@YZC ~]# sh test.sh #->常规情况下用命令sh执行; my machine name is YZC #->执行成功; [root@YZC ~]# bash test.sh #->用命令bash执行; my machine name is YZC #->执行成功; [root@YZC ~]#
第二种方法:
[root@YZC ~]# ./test.sh #->用点号直接执行当前路径的文件;该处无法用Tab键自动补全; -bash: ./test.sh: Permission denied #->结果该文件无执行权限而被拒绝; [root@YZC ~]# chmod +x test.sh #->赋予执行权限; [root@YZC ~]# ./test.sh #->再次用点号执行; my machine name is YZC #->执行成功; [root@YZC shell_program]# pwd /usr/local/shell_program [root@YZC shell_program]# ~/test.sh #->如果我们不在当前的目录下执行,则脚本文件前面跟路径; my machine name is YZC #->执行成功; [root@YZC shell_program]#
第三种方法:
[root@YZC ~]# source test.sh #->用source执行; my machine name is YZC #->执行成功; [root@YZC ~]# . test.sh #->用"."执行; my machine name is YZC #->执行成功; [root@YZC ~]#
这三种方法感觉不到有什么差别,但是通过第三种方法来执行的话就是另外一种结果产
[root@YZC ~]# echo 'userdir=`pwd`' >testsource.sh #->将pwd这个命令用反引号引起来,再将pwd的值赋予变量名为userdir的这个变量, 最后将这个内容输入到testsource.sh脚本文件中; [root@YZC ~]# cat testsource.sh #->查看是否成功 userdir=`pwd` #->脚本里面是有内容啦; [root@YZC ~]# sh testsource.sh #->我们用sh来执行; [root@YZC ~]# #->执行结果无任何内容显示;为什么没有结果,因为没有echo,做这条命令仅仅只是做定义而已,没有去打印,所以执行后没有结果显示; [root@YZC ~]# echo $userdir #->按照常理来说既然我定义了那么就应该echo出结果才对; [root@YZC ~]# #->但是echo后还是没有结果; [root@YZC ~]# . testsource.sh #->如果用"."点号来执行; [root@YZC ~]# echo $userdir #->然后再次echo; /root #->此时有结果显示了; [root@YZC ~]#
为什么会出现这样的情况呢,其实我们的窗口就是一个shell,我们的这个脚本它又是另外一个shell,那么我们执行sh testsource.sh的时候,它已经将userdir给定义了,但是它不会将这个定义传到当前这个shell当中来,它做不到,也没有这个功能,而这个点号"."加载,它就可以将脚本文件中的这个变量传到当前这个shell中来,所以用"."点号执行,它的这个变量的定义就保存到当前的命令行窗口了,最后咱们就可以echo了.
我们可以查看系统里面的脚本来观
[root@YZC ~]# more /etc/init.d/nfs #!/bin/sh # # nfs This shell script takes care of starting and stopping # the NFS services. # # chkconfig: - 60 20 # description: NFS is a popular protocol for file sharing across TCP/IP \ # networks. This service provides NFS server functionality , \ # which is configured via the /etc/exports file. # probe: true # config: /etc/sysconfig/nfs # Source function library. . /etc/rc.d/init.d/functions #->它在加载函数库的时候就是用的"."号来执行,那为什么不用sh或者bash来执行呢,用sh或者bash来执行也可以,但是后续的命令语句在调用这个脚本里面的变量或函数等时就不能被调用,只能用"."点号执行才能取到里面的内容,所以在脚本当中想加载一个脚本取这个脚本里面的内容时候一定要用点号"."或者source.这就是点和source的作用; #->后面内容省略.......
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
某互联网公司linux职位实际面试笔试填空题:
1.已知如下命令及返回结果,请问 echo $user 的返回的结果为( ) [root@YZC ~]# cat test.sh user=`whoami` [root@YZC ~]# sh test.sh [root@YZC ~]# echo $user
问:执行 echo $user 命令的结果是什么?
答案:返回的结果为空。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本文出自 “I don't be a loser” 博客,谢绝转载!