成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

這些必備的Linux shell知識你都掌握了嗎

系統 Linux
在linux下使用shell編程常常能夠極大簡化我們的工作。而下面這些必備的知識你是否都掌握了呢?

前言

在linux下使用shell編程常常能夠極大簡化我們的工作。而下面這些必備的知識你是否都掌握了呢?

入參和默認變量

對于shell腳本而言,有些內容是專門用于處理參數的,它們都有特定的含義,例如: 

  1. /home/shouwang/test.sh para1 para2 para3  
  2. $0                      $1    $2    $3  
  3. 腳本名              ***個參數      第三個參數 

其中$0代表了執行的腳本名,$1,$2分別代表了***個,第二個參數。除此之外,還有一些其他的默認變量,例如: 

  1. #  代表腳本后面跟的參數個數,前面的例子中有3個參數  
  2. $@  代表了所有參數,并且可以被遍歷  
  3. $*  代表了所有參數,且作為整體,和$*很像,但是有區別  
  4. $$  代表了當前腳本的進程ID  
  5. $?  代表了上一條命令的退出狀態 

變量

給變量賦值,使用等號即可,但是等號兩邊千萬不要有空格,等號右邊有空格的字符串也必須用引號引起來: 

  1. para1="hello world"  #字符串直接賦給變量para1 

unset用于取消變量。例如: 

  1. unset para1 

如何使用變量呢?使用變量時,需要在變量前加$,例如要打印前面para1的內容: 

  1. echo "para1 is $para1"  
  2. #將會輸出 para1 is hello world 

或者變量名兩邊添加大括號: 

  1. echo "para1 is ${para1}!"  
  2. #將會輸出 para1 is hello world! 

命令執行

在shell中執行命令通常只需要像在終端一樣執行命令即可,不過,如果想要命令結果打印出來的時候,這樣的方式就行不通了。因此,shell的命令方式常有: 

  1. a=`ls`   #`是左上角~鍵,不是單引號 

或者使用$,后面括號內是執行的命令: 

  1. echo "current path is $(pwd)"   # 

另外,前面兩種方式對于計算表達式也是行不通的,而要采取下面的方式: 

  1. echo "1+1=$((1+1))"  #打印:1+1=2 

即$后面用兩重括號將要計算的表達式包裹起來。

那如果要執行的命令存儲在變量中呢?前面的方法都不可行了,當然括號內的內容被當成命令執行還是成立的。要使用下面的方式,例如: 

  1. a="ls"  
  2. echo "$($a)" 

但是如果字符串時多條命令的時候,上面的方式又不可行了,而要采用下面的方式: 

  1. a="ls;pwd"  
  2. echo "$(eval $a)"v 

這是使用了eval,將a的內容都作為命令來執行。

條件分支

一般說明,如果命令執行成功,則其返回值為0,否則為非0,因此,可以通過下面的方式判斷上條命令的執行結果: 

  1. if [ $? -eq 0 ]  
  2. then  
  3.     echo "success"  
  4. elif [ $? -eq 1 ]  
  5. then  
  6.     echo "failed,code is 1"  
  7. else  
  8.     echo "other code"  
  9. fi 

case語句使用方法如下: 

  1. name="aa"  
  2. case $name in  
  3.     "aa")  
  4.     echo "name is $name"  
  5.     ;;  
  6.     "")  
  7.     echo "name is empty"  
  8.     ;;  
  9.     "bb")  
  10.     echo "name is $name"  
  11.     ;;  
  12.     *)  
  13.     echo "other name"  
  14.     ;;  
  15. esac 

初學者特別需要注意以下幾點:

  •  []前面要有空格,它里面是邏輯表達式
  •  if elif后面要跟then,然后才是要執行的語句
  •  如果想打印上一條命令的執行結果,***的做法是將 $?賦給一個變量,因為一旦執行了一條命令,$?的值就可能會變。
  •  case每個分支***以兩個分號結尾,***是case反過來寫,即esac。

多個條件如何使用呢,兩種方式,方式一: 

  1. if [ 10 -gt 5 -o 10 -gt 4 ];then  
  2.     echo "10>5 or 10 >4"  
  3. fi 

方式二: 

  1. if [ 10 -gt 5 ] || [ 10 -gt 4 ];then  
  2.     echo "10>5 or 10 >4"  
  3. fi 

其中-o或者||表示或。這里也有一些常見的條件判定。

總結如下:

  •   o or 或者,同||
  •  -a and 與,同&&
  •  ! 非

整數判斷:

  •  -eq 兩數是否相等
  •  -ne 兩數是否不等
  •  -gt 前者是否大于后者(greater then)
  •  -lt 前面是否小于后者(less than)
  •  -ge 前者是否大于等于后者(greater then or equal)
  •  -le 前者是否小于等于后者(less than or equal)

字符串判斷str1 exp str2:

  •  -z "$str1" str1是否為空字符串
  •  -n "$str1" str1是否不是空字符串
  •  "$str1" == "$str2" str1是否與str2相等
  •  "$str1" != "$str2" str1是否與str2不等
  •  "$str1" =~ "str2" str1是否包含str2

特別注意,字符串變量***用引號引起來,因為一旦字符串中有空格,這個表達式就錯了,有興趣的可以嘗試當str1="hello world",而str2="hello"的時候進行比較。

文件目錄判斷:filename

  •  -f $filename 是否為文件
  •  -e $filename 是否存在
  •  -d $filename 是否為目錄
  •  -s $filename 文件存在且不為空
  •  ! -s $filename 文件是否為空

循環

循環形式一,和Python的for in很像: 

  1. #遍歷輸出腳本的參數  
  2. for i in $@; do  
  3.   echo $i  
  4. done 

循環形式二,和C語言風格很像: 

  1. for ((i = 0 ; i < 10 ; i++)); do  
  2.   echo $i  
  3. done 

循環打印0到9。

循環形式三: 

  1. for i in {1..5}; do  
  2.     echo "Welcome $i"  
  3. done 

循環打印1到5。

循環方式四: 

  1. while [ "$ans" != "yes" ]  
  2. do  
  3.    read -p "please input yes to exit loop:" ans  
  4. done 

只有當輸入yes時,循環才會退出。即條件滿足時,就進行循環。

循環方式五: 

  1. ans=yes  
  2. until [ $ans != "yes" ]  
  3. do  
  4.    read -p "please input yes to exit loop:" ans  
  5. done 

這里表示,只有當ans不是yes時,循環就終止。

循環方式六: 

  1. for i in {5..15..3}; do  
  2.     echo "number is $i"  
  3. done 

每隔5打印一次,即打印5,8,11,14。

函數

定義函數方式如下: 

  1. myfunc()   
  2.  
  3.     echo "hello world $1"  

或者: 

  1. function myfunc()   
  2.  
  3.     echo "hello world $1"  

函數調用: 

  1. para1="shouwang"  
  2. myfunc $para1 

返回值

通常函數的return返回值只支持0-255,因此想要獲得返回值,可以通過下面的方式。 

  1. function myfunc() {  
  2.     local myresult='some value'  
  3.     echo $myresult  
  4.  
  5. val=$(myfunc)  #val的值為some value 

通過return的方式適用于判斷函數的執行是否成功: 

  1. function myfunc() {  
  2.     #do something  
  3.     return 0  
  4.  
  5. if myfunc;then  
  6.     echo "success"  
  7. else  
  8.     echo "failed"  
  9. fi 

注釋

shell通過#來注釋一行內容,前面我們已經看到過了: 

  1. #!/bin/bash  
  2. # 這是一行注釋  
  3. :'  
  4. 這是  
  5. 多行  
  6. 注釋  
  7.  
  8. ls  
  9. :<<EOF  
  10. 這也可以  
  11. 達到  
  12. 多行注釋  
  13. 的目的  
  14. EOF 

日志保存

腳本執行后免不了要記錄日志,最常用的方法就是重定向。以下面的腳本為例: 

  1. #!/bin/bash  
  2. #test.sh  
  3. lll  #這個命令是沒有的,因此會報錯  
  4. date 

方式一,將標準輸出保存到文件中,打印標準錯誤: 

  1. ./test.sh > log.dat 

這種情況下,如果命令執行出錯,錯誤將會打印到控制臺。所以如果你在程序中調用,這樣將不會講錯誤信息保存在日志中。

方式二,標準輸出和標準錯誤都保存到日志文件中: 

  1. ./test.sh > log.dat 2>&1 

2>&1的含義可以參考《如何理解linuxshell中的2>&1》

方式三,保存日志文件的同時,也輸出到控制臺: 

  1. ./test.sh |tee log.dat 

腳本執行

最常見的執行方式前面已經看到了: 

  1. ./test.sh 

其它執行方式: 

  1. sh test.sh  #在子進程中執行  
  2. sh -x test.sh #會在終端打印執行到命令,適合調試  
  3. source test.sh #test.sh在父進程中執行  
  4. . test.sh   #不需要賦予執行權限,臨時執行 

腳本退出碼

很多時候我們需要獲取腳本的執行結果,即退出狀態,通常0表示執行成功,而非0表示失敗。為了獲得退出碼,我們需要使用exit。例如: 

  1. #!/bin/bash  
  2. function myfun()  
  3.  
  4.     if [ $# -lt 2 ]  
  5.     then  
  6.        echo "para num error"  
  7.        exit 1  
  8.     fi  
  9.     echo "ok"  
  10.     exit 2  
  11.  
  12. if [ $# -lt 1 ]  
  13. then  
  14.    echo "para num error"  
  15.     exit 1  
  16. fi  
  17. returnVal=`myfun aa`  
  18. echo "end shell"  
  19. exit 0 

這里需要特別注意的一點是,使用 

  1. returnVal=`myfun aa` 

這樣的句子執行函數,即便函數里面有exit,它也不會退出腳本執行,而只是會退出該函數,這是因為exit是退出當前進程,而這種方式執行函數,相當于fork了一個子進程,因此不會退出當前腳本。最終結果就會看到,無論你的函數參數是什么***end shell都會打印。 

  1. ./test.sh;echo $?  

總結

以上就是shell編程最基本也是最關鍵的內容。當然這并非全部,例如數組,字典,參數處理等都沒有詳細介紹,由于篇幅有限,將會在后面的文章中進行詳細介紹。學好shell,解放你的雙手。

責任編輯:龐桂玉 來源: Linux學習
相關推薦

2019-11-20 10:38:36

路由路由協議路由器

2021-01-29 23:28:11

程序員語言開發

2023-08-08 08:08:42

PythonWeb開發

2018-06-21 11:03:54

shelllinux命令

2025-03-18 10:12:50

WindowsLinux?網絡命令

2020-12-17 08:39:36

Css前端html

2022-12-19 08:05:04

Python速查表知識點

2020-11-20 14:45:48

HandlerAndroid代碼

2018-10-25 10:36:50

物聯網誤區IOT

2018-07-31 16:31:42

家電

2024-09-12 17:39:27

2020-12-09 18:16:48

容器云開發CaaS

2018-09-02 10:43:02

網絡故障處理手段

2022-10-24 10:18:04

自然語言計算機視覺

2018-05-20 11:01:47

Siri語音助手手機

2010-08-04 15:01:00

2024-01-05 09:23:09

Linux系統內存內存指標

2020-02-03 13:55:49

技術研發指標

2020-10-14 07:52:36

ES11編程語言開發

2024-08-13 08:30:13

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九九国产 | 人人艹人人爽 | 日本午夜精品 | 欧美二区在线 | 久久夜视频 | 国产一级视频在线播放 | 丝袜毛片 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 色资源av| 日韩有码在线播放 | 国产精品久久久久av | 久久国产精品久久久久久 | 久久久久久免费毛片精品 | 亚洲精品久久久久久下一站 | 欧美成年黄网站色视频 | 天天av网 | 高清一区二区视频 | 国产精品99久久久久久宅男 | 色视频在线播放 | 毛片一区二区三区 | 羞羞视频在线观看免费观看 | 日韩一区二区在线视频 | 91国产在线播放 | 久久精品福利视频 | 久久中文网 | 国产精品久久久久久久久动漫 | 欧美专区在线视频 | 国产在线观看一区 | 色综合视频 | 亚洲精品18 | 99色在线| 欧美一级毛片在线播放 | 中文字幕在线观看 | 国产精品久久一区二区三区 | 国产精品美女久久久久久免费 | 最新日韩av | 久久亚洲一区二区 | 一级欧美日韩 | 日韩av一区二区在线观看 | 国产亚洲成av人片在线观看桃 | 欧美日韩在线视频一区 |