1. 程式人生 > >shell-腳本的執行

shell-腳本的執行

最大 結束 聯網 使用 好用 測試 linux source oldboy

#1. shell-腳本的執行

  • 當shell腳本以非交互的方式運行時,它會先查找環境變量ENV,該變量指定了一個環境文件(通常是.bashrc),然後從該環境變量文件開始執行,當讀取了ENV文件後,shell才開始執行shell腳本中的內容。
  • shell腳本的執行通常可以采用以下三種方式:
    1. Bash script-name 或sh script-name (推薦使用)
    2. Path/script-name 或./script-name (當前路徑下執行腳本)
    3. Source script-name 或 .script-name #註意“.”點號。
  • 執行說明
    • 第一種方法是當腳本文件本身沒有可執行權限(即文件X位為-號)時常使用的方法,這裏推薦用bash執行,或者文件開頭沒有指定解釋器
    • 第二種方法需要先將腳本文件的權限改為可執行(即文件加X位),具體方法:chmod u+x script-name 或 chmod 755 script-name 。然後通過腳本路徑就可以直接執行腳本了。
    • 第三種方法通常是使用 source或者“,”點號讀入或加載指定的shelll腳本文件(san.sh),然後,依次執行指定shell腳本文件san.sh中的所有語句。這些語句將作為父shell腳本father.sh進程的一部分運行。因此,使用source或者“.”點號可以將san.sh自身腳本中的變量的值或函數等的返回值傳遞到當前的父shell腳本father.sh中使用。這是第三種方法和前兩種方法的最大區別,也是值得讀者註意的地方。
    • source或者“."點號命令的功能是在當前shell中執行source或者“.”點號加載並執行的相關腳本文件中的命令及語句,而不是產生一個子shell來執行命令文件中的命令。
      #2.下面我們舉例說明:
      ##2.1 使用第一種方法
      [root@yanwei-test1 scripts]# cat test.sh
      echo ‘I am oldboy‘
      輸入“echo ‘I am oldboy”內容後按回車,然後在按ctrl+d組合建即可結束編程。此操作作為特殊編輯方法,作為cat用法的擴展知識提及(老男孩PS:在使用中去記憶是個好習慣)
      [root@yanwei-test1 scripts]# cat test.sh
      echo ‘I am oldboy‘
      [root@yanwei-test1 scripts]# sh test.sh #使用第一種方式的sh命令執行test.sh腳本文件
      I am oldboy
      [root@yanwei-test1 scripts]# bash test.sh #使用第一種方式的sh命令執行test.sh腳本文件
      I am oldboy
      我們使用第一種方法,發現均可以執行並得到了預期的結果。
      ##2.2 使用第二種方法
      [root@yanwei-test1 scripts]# ./test.sh #使用第二種方式“./”在當前目錄下執行test.sh腳本文件,細心的讀者可以發現,這個地方無法自動補全。
      -bash: ./test.sh: 權限不夠 #提示:權限拒絕,此處因為沒有執行權限
      [root@yanwei-test1 scripts]# chmod +x test.sh
      [root@yanwei-test1 scripts]# ./test.sh
      I am oldboy
      但是可以用source或者"."點號執行
      [root@yanwei-test1 scripts]# . test.sh #請註意,這裏“.”執行,必須有空格
      I am oldboy
      [root@yanwei-test1 scripts]# source test.sh
      I am oldboy
      我們看到,給test.sh加完可執行權限就可以執行了
      ##2.3 使用第三種方法
      現在測試第三種方法source或者“.”點號的特殊的傳遞變量值到當前shell的例子
      [root@yanwei-test1 scripts]# echo ‘userdir=pwd‘ > testsource.sh #一行的內容通常用echo編輯很方便
      [root@yanwei-test1 scripts]# cat testsource.sh
      userdir=pwd
      [root@yanwei-test1 scripts]# sh testsource.sh
      [root@yanwei-test1 scripts]# echo $userdir
      #此處為空,並沒有出現當前路徑輸出,這是為什麽呢?
      根據上面例子,我們可以發現,通過sh或bash命令執行過的腳本,腳本結束後在當前shell窗口查看userdir變量的值,發現值是為空的,現在以同樣的步驟改用source執行,然後再看看userdir變量的值。
      [root@yanwei-test1 scripts]# source testsource.sh
      [root@yanwei-test1 scripts]# echo $userdir
      /server/scripts
  • 結論:通過source或“.”點號加載執行過的腳本,在腳本結束後腳本中的變量(包括函數)值在當前shell中依然存在,而sh和bash則不行。因此,在做shell腳本開發時,如果腳本中有需求引用其他腳本的內容或者配置文件時,最好用“.”點號或source在腳本開頭加載該腳本或配置文件,然後在下面的內容用可以調用source加載的腳本及文件中的變量及函數等內容。
    ##2.4 某互聯網公司linux運維職位實際面試筆試填空題:
    已知如下命令及返回結果,請問echo $user的返回的結果為( )
    [root@yanwei-test1 scripts]# echo ‘user=whoami‘ >whoamisource.sh
    [root@yanwei-test1 scripts]# cat whoamisource.sh
    user=whoami
    [root@yanwei-test1 scripts]# sh whoamisource.sh
    [root@yanwei-test1 scripts]# echo $user

    答案:
            1、當前用戶
            2、空(無內容輸出) #這個是正確答案

shell-腳本的執行