假設已經寫好的這個程序文件名是/home/dmtsai/shell.sh,有以下幾種方法執行:
1、直接命令執行:shell文件必須具備可執行(rx)權限。然後:
(1)絕對路徑執行:/home/dmtsai/shell.sh;
(2)相對路徑執行,假設工作目錄在/home/dmtsai/,則使用./shell.sh執行;
(3)變量“PATH”功能:將shell放在PATH指定的目錄下或者在PATH添加你shell文件所在的目錄。
2、以bash進程來執行;通過bash shell.sh或sh shell.sh來執行。
3、利用不同的執行方式將造成不一樣的結果,尤其對bash環境影響很大。
(1)當使用直接命令執行(不論是絕對路徑還是相對路徑還是在$PATH內),或者是bash(或者sh)來執行腳本時,該腳本也就是說使用這種執行方式時, 其實 script 是在子程序的 bash 內執行的! 重點在於當子程序完成後,在子程序內的各項變量將會結束而不會回傳到父程序中』! 這是什麼意思呢?
例如:
[root@www scripts]# vi sh02.sh
#!/bin/bash
# Program:
# User inputs his first name and last name. Program shows his full
name.
# History:
# 2005/08/23 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input your first name: " firstname # 提示使用者輸入
read -p "Please input your last name: " lastname # 提示使用者輸入
echo -e "\nYour full name is: $firstname $lastname" # 結果由屏幕輸出
如果你直接使用直接命令執行方式,將會出現下面的結果
[root@www scripts]# echo $firstname $lastname
<==確認了,這兩個變量不存在喔!
[root@www scripts]# sh sh02.sh
Please input your first name: VBird <==這個名字是鳥哥自己輸入的
Please input your last name: Tsai
Your full name is: VBird Tsai <==看吧!在 script 運作中,這兩個變數有
生效
[root@www scripts]# echo $firstname $lastname
<==事實上,這兩個變量在父程序的 bash 中還是不存在的!
上面的結果你應該會覺得很奇怪,怎舉我已經刟用sh02.sh設定好的發量竟然在 bash環境底下無效!怎麼回事呢?如果將程序相關性繪制成圖的話,我們以下圖來說明。當你使用直接執行的方法來處理時,系統會給予一支新的bash讓我們來執行sh02.sh裡面的指令,因此你的firstname, lastname等發量其實是在下圖中的子程序bash內執行的。當sh02.sh執行完畢後,子程序bash內的所有數據便被清除,因此上表的練習中,在父程序底下echo $firstname 時,就看不到任何東西了!這樣可以理解嗎?
(2)利用source(或者.)來執行就不一樣了,它其實在父進程中執行。結果如下:
[root@www scripts]# source sh02.sh
Please input your first name: VBird
Please input your last name: Tsai
Your full name is: VBird Tsai
[root@www scripts]# echo $firstname $lastname
VBird Tsai <==嘿嘿!有數據產生喔!
執行流程如下