shell一文入门通
簡單來說“Shell編程就是對一堆Linux命令的邏輯化處理”。
W3Cschool 上的一篇文章是這樣介紹 Shell的
hello world
學習任何一門編程語言第一件事就是輸出HelloWord了!下面我會從新建文件到shell代碼編寫來說下Shell 編程如何輸出Hello World。
(1)新建一個文件 helloworld.sh :touch helloworld.sh,擴展名為 sh(sh代表Shell)(擴展名并不影響腳本執行,見名知意就好,如果你用 php 寫 shell 腳本,擴展名就用 php 好了)
(2) 使腳本具有執行權限:chmod +x helloworld.sh
(3) 使用 vim 命令修改helloworld.sh文件:vim helloworld.sh(vim 文件------>進入文件----->命令模式------>按i進入編輯模式----->編輯文件 ------->按Esc進入底行模式----->輸入:wq/q! (輸入wq代表寫入內容并退出,即保存;輸入q!代表強制退出不保存。))
helloworld.sh 內容如下:
#!/bin/bash #第一個shell小程序,echo 是linux中的輸出命令。 echo "helloworld!"shell中 # 符號表示注釋。shell 的第一行比較特殊,一般都會以#!開始來指定使用的 shell 類型。在linux中,除了bash shell以外,還有很多版本的shell, 例如zsh、dash等等...不過bash shell還是我們使用最多的。
(4) 運行腳本:./helloworld.sh?。(注意,一定要寫成?./helloworld.sh?,而不是?helloworld.sh?,運行其它二進制的程序也一樣,直接寫?helloworld.sh?,linux 系統會去 PATH 里尋找有沒有叫 helloworld.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的當前目錄通常不在 PATH 里,所以寫成?helloworld.sh?是會找不到命令的,要用./helloworld.sh?告訴系統說,就在當前目錄找。)
變量
Shell編程中一般分為三種變量:
常用的環境變量:
PATH 決定了shell將到哪些目錄中尋找命令或程序 HOME 當前用戶主目錄 HISTSIZE 歷史記錄數 LOGNAME 當前用戶的登錄名 HOSTNAME 指主機的名稱 SHELL 當前用戶Shell類型 LANGUGE 語言相關的環境變量,多語言可以修改此環境變量 MAIL 當前用戶的郵件存放目錄 PS1 基本提示符,對于root用戶是#,對于普通用戶是$
使用 Linux 已定義的環境變量:
比如我們要看當前用戶目錄可以使用:echo $HOME命令;如果我們要看當前用戶Shell類型 可以使用echo $SHELL命令。可以看出,使用方法非常簡單。
使用自己定義的變量:
#!/bin/bash #自定義變量hello hello="hello world" echo $hello echo "helloworld!"Shell 編程中的變量名的命名的注意事項:
- 命名只能使用英文字母,數字和下劃線,首個字符不能以數字開頭,但是可以使用下劃線(_)開頭。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
字符串
字符串是shell編程中最常用最有用的數據類型(除了數字和字符串,也沒啥其它類型好用了),字符串可以用單引號,也可以用雙引號。這點和Java中有所不同。
單引號字符串:
#!/bin/bash name='SnailClimb' hello='Hello, I am '$name'!' echo $hello輸出內容:
Hello, I am SnailClimb!雙引號字符串:
#!/bin/bash name='SnailClimb' hello="Hello, I am "$name"!" echo $hello輸出內容:
Hello, I am SnailClimb!拼接字符串:
#!/bin/bash name="SnailClimb" # 使用雙引號拼接 greeting="hello, "$name" !" greeting_1="hello, ${name} !" echo $greeting $greeting_1 # 使用單引號拼接 greeting_2='hello, '$name' !' greeting_3='hello, ${name} !' echo $greeting_2 $greeting_3輸出結果:
獲取字符串長度:
#!/bin/bash #獲取字符串長度 name="SnailClimb" # 第一種方式 echo ${#name} #輸出 10 # 第二種方式 expr length "$name";輸出結果:
10 10使用 expr 命令時,表達式中的運算符左右必須包含空格,如果不包含空格,將會輸出表達式本身:
expr 5+6 // 直接輸出 5+6 expr 5 + 6 // 輸出 11對于某些運算符,還需要我們使用符號\進行轉義,否則就會提示語法錯誤。
expr 5 * 6 // 輸出錯誤 expr 5 \* 6 // 輸出30截取子字符串:
簡單的字符串截取:
#從字符串第 1 個字符開始往后截取 10 個字符 str="SnailClimb is a great man" echo ${str:0:10} #輸出:SnailClimb根據表達式截取:
#!bin/bash #author:amauvar="http://www.runoob.com/linux/linux-shell-variable.html"s1=${var%%t*}#h s2=${var%t*}#http://www.runoob.com/linux/linux-shell-variable.h s3=${var%%.*}#http://www s4=${var#*/}#/www.runoob.com/linux/linux-shell-variable.html s5=${var##*/}#linux-shell-variable.html數組
bash支持一維數組(不支持多維數組),并且沒有限定數組的大小。我下面給了大家一個關于數組操作的 Shell 代碼示例,通過該示例大家可以知道如何創建數組、獲取數組長度、獲取/刪除特定位置的數組元素、刪除整個數組以及遍歷數組。
#!/bin/bash array=(1 2 3 4 5); # 獲取數組長度 length=${#array[@]} # 或者 length2=${#array[*]} #輸出數組長度 echo $length #輸出:5 echo $length2 #輸出:5 # 輸出數組第三個元素 echo ${array[2]} #輸出:3 unset array[1]# 刪除下標為1的元素也就是刪除第二個元素 for i in ${array[@]};do echo $i ;done # 遍歷數組,輸出: 1 3 4 5 unset arr_number; # 刪除數組中的所有元素 for i in ${array[@]};do echo $i ;done # 遍歷數組,數組元素為空,沒有任何輸出內容?
Shell 編程支持下面幾種運算符
- 算數運算符
- 關系運算符
- 布爾運算符
- 字符串運算符
- 文件測試運算符
算數
我以加法運算符做一個簡單的示例(注意:不是單引號,是反引號):
#!/bin/bash a=3;b=3; val=`expr $a + $b` #輸出:Total value : 6 echo "Total value : $val"關系
關系運算符只支持數字,不支持字符串,除非字符串的值是數字。
通過一個簡單的示例演示關系運算符的使用,下面shell程序的作用是當score=100的時候輸出A否則輸出B。
#!/bin/bash score=90; maxscore=100; if [ $score -eq $maxscore ] thenecho "A" elseecho "B" fi輸出結果:
B邏輯
示例:
#!/bin/bash a=$(( 1 && 0)) # 輸出:0;邏輯與運算只有相與的兩邊都是1,與的結果才是1;否則與的結果是0 echo $a;布爾
這里就不做演示了,應該挺簡單的。
字符串
簡單示例:
#!/bin/bash a="abc"; b="efg"; if [ $a = $b ] thenecho "a 等于 b" elseecho "a 不等于 b" fi輸出:
a 不等于 b文件
使用方式很簡單,比如我們定義好了一個文件路徑file="/usr/learnshell/test.sh"?如果我們想判斷這個文件是否可讀,可以這樣if [ -r $file ]?如果想判斷這個文件是否可寫,可以這樣-w $file,是不是很簡單。
流程控制
if
簡單的 if else-if else 的條件語句示例
#!/bin/bash a=3; b=9; if [ $a -eq $b ] thenecho "a 等于 b" elif [ $a -gt $b ] thenecho "a 大于 b" elseecho "a 小于 b" fi輸出結果:
a 小于 b相信大家通過上面的示例就已經掌握了 shell 編程中的 if 條件語句。不過,還要提到的一點是,不同于我們常見的 Java 以及 PHP 中的 if 條件語句,shell if 條件語句中不能包含空語句也就是什么都不做的語句。
for
通過下面三個簡單的示例認識 for 循環語句最基本的使用,實際上 for 循環語句的功能比下面你看到的示例展現的要大得多。
輸出當前列表中的數據:
for loop in 1 2 3 4 5 doecho "The value is: $loop" done產生 10 個隨機數:
#!/bin/bash for i in {0..9}; do echo $RANDOM; done輸出1到5:
通常情況下 shell 變量調用需要加 $,但是 for 的 (()) 中不需要,下面來看一個例子:
#!/bin/bash for((i=1;i<=5;i++));doecho $i; done;while
基本的 while 循環語句:
#!/bin/bash int=1 while(( $int<=5 )) doecho $intlet "int++" donewhile循環可用于讀取鍵盤信息:
echo '按下 <CTRL-D> 退出' echo -n '輸入你最喜歡的電影: ' while read FILM doecho "是的!$FILM 是一個好電影" done輸出內容:
按下 <CTRL-D> 退出 輸入你最喜歡的電影: 變形金剛 是的!變形金剛 是一個好電影無限循環:
while true docommand done不帶參數沒有返回值的函數
#!/bin/bash hello(){echo "這是我的第一個 shell 函數!" } echo "-----函數開始執行-----" hello echo "-----函數執行完畢-----" -----函數開始執行----- 這是我的第一個 shell 函數! -----函數執行完畢-----有返回值
相加
#!/bin/bash funWithReturn(){echo "輸入第一個數字: "read aNumecho "輸入第二個數字: "read anotherNumecho "兩個數字分別為 $aNum 和 $anotherNum !"return $(($aNum+$anotherNum)) } funWithReturn echo "輸入的兩個數字之和為 $?" 輸入第一個數字: 1 輸入第二個數字: 2 兩個數字分別為 1 和 2 ! 輸入的兩個數字之和為 3帶參數
#!/bin/bash funWithParam(){echo "第一個參數為 $1 !"echo "第二個參數為 $2 !"echo "第十個參數為 $10 !"echo "第十個參數為 ${10} !"echo "第十一個參數為 ${11} !"echo "參數總數有 $# 個!"echo "作為一個字符串輸出所有參數 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73 第一個參數為 1 ! 第二個參數為 2 ! 第十個參數為 10 ! 第十個參數為 34 ! 第十一個參數為 73 ! 參數總數有 11 個! 作為一個字符串輸出所有參數 1 2 3 4 5 6 7 8 9 34 73 !?
總結
以上是生活随笔為你收集整理的shell一文入门通的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取驱动失败Java连接数据库,好哀伤,
- 下一篇: 记一段 Kotlin 处理 HashMa