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 命令的結果是什麼?
答案:返回的結果爲空。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++