轉帖|行業資訊|編輯:龔雪|2015-10-12 15:23:37.000|閱讀 574 次
概述:shell腳本可以直接與操作系統內核打交道,從而完成任意復雜的任務,讓我們一起來看看shell是如何完成某些特殊復雜的功能的。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
學習linux操作系統最讓人著迷的事情莫過于shell腳本編程,這是因為如果要完成某些復雜的功能,單純地通過GUI操作不可能達到,shell腳本可以直接與操作系統內核打交道,從而完成任意復雜的任務。shell有很多種,最常用的是Bash (Bourne Again Shell),它是Linux操作系統默認的shell環境。
在linux環境中,需要區分一下root用戶與一般用戶的命令行顯示:
//root用戶與一般用戶顯示有一些差異 //root用戶命令行以#結尾 root@sparkmaster:~# su zhouzhihu //一般用戶命令行以$符號結尾 zhouzhihu@sparkmaster:/root$ exit exit root@sparkmaster:~#
如下圖:
現在讓我們來編寫第一個shell程序吧
root@sparkmaster:~/ShellLearning/chapter09# vi HelloWorld.sh
就兩行內容:
#!/bin/bash echo "Hello Shell"
那完成后如果執行shell腳本程序呢?有兩種方式,一種是通過sh命令,另外一種是自執行方式。下面給出了具體演示
//完成后直接利用sh命令執行 root@sparkmaster:~/ShellLearning/chapter09# sh HelloWorld.sh Hello Shell //自執行(self execute)方式,由于沒有給文件加執行權限,所以執行失敗 root@sparkmaster:~/ShellLearning/chapter09# ./HelloWorld.sh bash: ./HelloWorld.sh: Permission denied root@sparkmaster:~/ShellLearning/chapter09# ls -l total 4 -rw-r--r-- 1 root root 31 2015-09-30 06:29 HelloWorld.sh //chmod給文件加執行權限 root@sparkmaster:~/ShellLearning/chapter09# chmod a+x HelloWorld.sh //再通過自執行方式 root@sparkmaster:~/ShellLearning/chapter09# ./HelloWorld.sh Hello Shell root@sparkmaster:~/ShellLearning/chapter09#
前面提到,腳本第一行是#!/bin/bash,它的作用是提示該腳本的執行路徑是/bin/bash,對自執行方式有用,自執行方式最終是通過/bin/bash HelloWorld.sh 執行腳本,而利用sh HelloWorld.sh命令執行腳本時,#!/bin/bash 不起作用。
HelloWorld.sh文件中的echo “Hello Shell”是一條語句,一般習慣于一行一條語句,如:
#!/bin/bash echo "Hello Shell" echo "Hello World"
如果要將上述語句放在一行,則需要用;隔開
echo "Hello Shell";echo "Hello World"
echo命令用于輸出一行內容(包括行符),后面的輸出內容除可以用”“雙引號之外,也可以不加,也可以用單引號”例如:
root@sparkmaster:~/ShellLearning/chapter09# echo "Hello World" Hello World root@sparkmaster:~/ShellLearning/chapter09# echo Hello World Hello World root@sparkmaster:~/ShellLearning/chapter09# echo 'Hello World' Hello World
這三種方式看上去似乎相同,但其實它們之間還是有差異的,具體如下:
//對于一些特殊字符,雙引號可能不會正常輸出 root@sparkmaster:~/ShellLearning/chapter09# echo "Hello World!" bash: !": event not found //不帶引號的參數不會出現這種情況 root@sparkmaster:~/ShellLearning/chapter09# echo 'Hello World!' Hello World! //單引號也能正常輸出 root@sparkmaster:~/ShellLearning/chapter09# echo Hello World! Hello World! //不帶引號的參數使用如果帶特殊字符,兩條語句不能放在同一行 root@sparkmaster:~/ShellLearning/chapter09# echo Hello World!;echo Hello bash: !: event not found //不帶引號,輸出的是變量內容 root@sparkmaster:~/ShellLearning/chapter09# echo $JAVA_HOME /hadoopLearning/jdk1.7.0_67 //雙引號,輸出的也是變量內容 root@sparkmaster:~/ShellLearning/chapter09# echo "$JAVA_HOME" /hadoopLearning/jdk1.7.0_67 //單引號的話,內容原樣輸出,不會解析變量值 root@sparkmaster:~/ShellLearning/chapter09# echo '$JAVA_HOME' $JAVA_HOME
前一小節提到$JAVA_HOME,這是配置的JAVA環境變量,這一小節我們將介紹如何進行變量定義,如何配置環境變量。同任何的編程語言一樣,變量是用來存儲可變數據的,即在程序運行過程中變量中的數據可能隨時發生變化。shell腳本中的變量同其它腳本語言一樣,在使用時不需要進行類型定義,不管是加引號還是不加引號定義變量,其類型都為String,例如:
//t1為String類型 root@sparkmaster:~/ShellLearning/chapter09# t1="123" root@sparkmaster:~/ShellLearning/chapter09# $t1 123: command not found root@sparkmaster:~/ShellLearning/chapter09# echo $t1 //t1為String類型 root@sparkmaster:~/ShellLearning/chapter09# t1=123 root@sparkmaster:~/ShellLearning/chapter09# echo $t1 123
上面的變量是我們自己定義的,它具有一定的局部性,例如:
root@sparkmaster:~/ShellLearning/chapter09# t1=123 //在當前進程中能夠正常輸出內容 root@sparkmaster:~/ShellLearning/chapter09# echo $t1 123 //開啟一個子進程 root@sparkmaster:~/ShellLearning/chapter09# bash //無內容輸出 root@sparkmaster:~/ShellLearning/chapter09# echo $t1 //退出,返回原父進程 root@sparkmaster:~/ShellLearning/chapter09# exit exit //內容又能夠正常輸出 root@sparkmaster:~/ShellLearning/chapter09# echo $t1 123
從上面的代碼可以看到,自定義變量具有只能在當前進程中使用,當開啟子進程時,變量在子進程中不起作用,如果需要父進程中定義的變量在子進程中也能夠使用,則需要將其設置為環境變量,環境變量使用export命令進行定義,代碼如下:
//采用export命令將t1設置為環境變量 root@sparkmaster:~/ShellLearning/chapter09# export t1 root@sparkmaster:~/ShellLearning/chapter09# bash //子進程中現在可能使用 root@sparkmaster:~/ShellLearning/chapter09# $t1 123: command not found root@sparkmaster:~/ShellLearning/chapter09# echo $t1 123
不過,這樣定義的環境變量,在命令行窗口關閉或系統重新啟動時會丟失,如果需要在機器啟動時環境變量就自動生效的話,可以將環境變量定義在~/.bashrc或/etc/profile文件中,其中~/.bashrc只對當前用戶(例如當前用戶是zhouzhihu,則只對本用戶有效),如果想對所有用戶都有效,則將其放置在/etc/profile文件中。
下圖給出了java、scala語言等環境變量配置演示:
在linux腳本編程中,有幾個非常重要的特殊變量,說它特殊是因為它變量無需程序員自己定義,系統默認會幫我們進行初始化等相關操作,常用特殊變量如下:
$# 是傳給腳本的參數個數 $0 是腳本本身的名字 $1 是傳遞給該shell腳本的第一個參數 $2 是傳遞給該shell腳本的第二個參數 $@ 是傳給腳本的所有參數的列表 $* 是以一個單字符串顯示所有向腳本傳遞的參數,與位置變量不同,參數可超過9個 $$ 是腳本運行的當前進程ID號 $? 是顯示最后命令的退出狀態,0表示沒有錯誤,其他表示有錯誤
下面我們舉例進行演示:
root@sparkmaster:~/ShellLearning/chapter09# vi SpecialVariable.sh
root@sparkmaster:~/ShellLearning/chapter09# ./SpecialVariable.sh 1 2 3 4
4
./SpecialVariable.sh
1
2
1 2 3 4
1 2 3 4
17138
0
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn