標籤:

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:大數據 |