Linux大數據開發之Shell編程基礎
概述:shell腳本可以直接與操作系統內核打交道,從而完成任意複雜的任務,讓我們一起來看看shell是如何完成某些特殊複雜的功能的。
本節主要內容:
1.shell編程簡介
2. 變數定義
3. 常用特殊變數
1.shell編程簡介
學習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程序吧
1root@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
2. 變數定義
前一小節提到$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語言等環境變數配置演示:3. 常用特殊變數
在linux腳本編程中,有幾個非常重要的特殊變數,說它特殊是因為它變數無需程序員自己定義,系統默認會幫我們進行初始化等相關操作,常用特殊變數如下:
1
2
3
4
5
6
7
8$# 是傳給腳本的參數個數
$0
是腳本本身的名字
$1
是傳遞給該shell腳本的第一個參數
$2
是傳遞給該shell腳本的第二個參數
$@ 是傳給腳本的所有參數的列表
$* 是以一個單字元串顯示所有向腳本傳遞的參數,與位置變數不同,參數可超過9個
$$ 是腳本運行的當前進程ID號
$? 是顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤
下面我們舉例進行演示:
1root@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推薦閱讀:
※陳書悅:大數據可否幫助炒股?
※堆內和堆外
※用Apache Spark進行大數據處理——第一部分:入門介紹
※如何讓產品改版評估更智能更高效?
※大數據雙創行動計劃丨校車的智慧在哪裡?
TAG:大數據 |