歡迎您光臨本站 註冊首頁

3000字掃盲shell基礎知識(新手必備)

←手機掃碼閱讀     sl_ivan @ 2020-06-27 , reply:0

不論前端還是後端,再學會Linux的基礎上,還應該學會寫一些簡單的Shell。不止是工作,日常中想做一些東西,如果手動做就很累人也費時間,如果你會用Shell腳本處理就很簡單了,本文普及的shell的一些基礎知識。後面還會持續更新。    
   

shell基礎語法之變量    
   

shell 變量命名    
   

  • 變量只能由大小寫字母,數字和下劃線組成。

  • 變量名稱不能以數字開頭。

  • 變量可以存儲數字類型或者字符串類型。

  • 變量賦值等號兩邊不能有空格。

  • 字符串的變量可以用單引號或者雙引號括起來。

定義變量:    
   

  ➜ ~ name="xiaoka"  ➜ ~ age=2

   

無效的定義    
    [

  root@iz2ze0ajic0vbv28hcdctpz hello]# 1212=sfds  -bash: 1212=sfds: 未找到命令  [root@iz2ze0ajic0vbv28hcdctpz hello]# ?aasd=hehe  -bash: ?aasd=hehe: 未找到命令

   

shell 變量調用    
   

變量的調用使用$符號或者$符號加上花括號。一般來講使用花括號的用法。    
   

舉例說明:    
   

  [root@iz2ze0ajic0vbv28hcdctpz hello]# apple=hongfushi  [root@iz2ze0ajic0vbv28hcdctpz hello]# echo $applepen    [root@iz2ze0ajic0vbv28hcdctpz hello]# echo ${apple}pen  hongfushipen

   

如果不加花括號,就會讀成applepen為一個變量,因此解析產生了歧義。    
   

shell 變量分類

  • 環境變量:保存操作系統運行時使用的參數。

  • 位置變量:傳遞腳本參數時使用。

  • 預定義變量:類似於環境變量,不同是它是不能重定義的。

  • 自定義變量:由用戶自定義,可用於用戶編寫的腳本。

自定義變量:    
   

定義變量database:    
   

  [root@iz2ze0ajic0vbv28hcdctpz hello]# database=mysql    [root@iz2ze0ajic0vbv28hcdctpz hello]# echo $database  mysql  [root@iz2ze0ajic0vbv28hcdctpz hello]# echo ${database}  mysql

   

環境變量:查看全局環境變量:    
   

  [root@iz2ze0ajic0vbv28hcdctpz ~]# printenv  XDG_SESSION_ID=2044  HOSTNAME=iz2ze0ajic0vbv28hcdctpz  TERM=xterm-256color  SHELL=/bin/bash  HISTSIZE=1000  SSH_CLIENT=113.44.42.209 56074 22  SSH_TTY=/dev/pts/1  USER=root  LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:  MAVEN_HOME=/usr/local/apache-maven-3.6.0  MAIL=/var/spool/mail/root  PATH=/usr/local/apache-maven-3.6.0/bin:/usr/local/jdk1.8.0_191/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin  PWD=/root  JAVA_HOME=/usr/local/jdk1.8.0_191  LANG=zh_CN.UTF-8  HISTCONTROL=ignoredups  SHLVL=1  HOME=/root  LOGNAME=root  CLASSPATH=.:/lib/dt.jar:/lib/tools.jar  SSH_CONNECTION=113.44.42.209 56074 172.17.187.244 22  LC_CTYPE=zh_CN.UTF-8  LESSOPEN=||/usr/bin/lesspipe.sh %s  XDG_RUNTIME_DIR=/run/user/0  _=/usr/bin/printenv

   

定義一個環境變量    
   

  [root@iz2ze0ajic0vbv28hcdctpz ~]# export kaka="kaka"  [root@iz2ze0ajic0vbv28hcdctpz ~]# env |grep kaka  kaka=kaka

   

刪除環境變量    
   

  [root@iz2ze0ajic0vbv28hcdctpz ~]# unset kaka  [root@iz2ze0ajic0vbv28hcdctpz ~]# env |grep kaka

   

w如果長期使用,可以把它們寫在配置文件中。/etc/profile 或者 用戶家目錄的.bash_profile    
   

位置變量 :    
   

我們先定義一個shell。    
   

  [root@iz2ze0ajic0vbv28hcdctpz ~]# cat test.sh  #!/bin/bash    echo "執行的文件: $0"  echo "第一個參數: $1"  echo "第二個參數: $2"

   

執行查看結果。    
   

[root@iz2ze0ajic0vbv28hcdctpz ~]# chmod +x test.sh      
     [root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2      
     執行的文件: ./test.sh      
     第一個參數: 1      
     第二個參數: 2

預定義變量:    
   

常用的預定義變量有如下幾個。

   

  #!/bin/bash    echo "執行的文件: $0"  echo "第一個參數: $1"  echo "第二個參數: $2"  echo "所有參數: $*"  echo "當前腳本的pid: $"  echo "腳本參數個數: $#"

   

查看執行結果    
   

[root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2      
     執行的文件: ./test.sh      
     第一個參數: 1      
     第二個參數: 2      
     所有參數: 1 2      
     當前腳本的pid: 30170      
     腳本參數個數: 2

查看上一個命令執行結果。    
   

[root@iz2ze0ajic0vbv28hcdctpz hello]# ls      
     test      
     [root@iz2ze0ajic0vbv28hcdctpz hello]# echo $?      
     0

shell 運算符    
   

shell也是一門語言其實和其他的語言運算符大同小異,不過這裡我們還是來說一下。本節說一下運算符相關內容。    
   

運算符種類

  • 算數運算符

  • 關係運算符

  • 布爾運算符

  • 邏輯運算符

  • 字符串運算符

  • 文件測試運算符      

     算數運算符        

   

命令: expr    
    作用:   求表達式的值    
    語法:    expr 表達式    
    規則:

  •     運算符號兩邊要有空格

  • 遇到特殊符號如*號需要在前面加反斜槓

  • 空格和特殊字符串需要用引號括起來

操作:(先編寫一個運算相關的shell腳本)

  #!/bin/bash  i=1  j=2  addition=`expr $i + $j`  subtraction=`expr $i - $j`  multiplication=`expr $j * $j`  division=`expr $j / $i`  mod=`expr $j % $i`  echo "addition=${addition} , subtraction=${subtraction} , multiplication=${multiplication} , division=${division} , mod=${mod}"    if [ $i == $j ]  then   echo "i 等於 j"  fi    if [ $i != $j ]  then   echo "i 不等於 j"  fi

   

查看結果:    
   

➜  ~ ./operation.sh      
     addition=3 , subtraction=-1 , multiplication=4 , division=2 , mod=0      
     i 不等於 j

關係運算符

   

操作:(編寫腳本)    
   

  #!/bin/bash  num1=5  num2=8  if [ $num1 -eq $num2 ]  then   echo "$num1 是否等於 $num2 : num1 等於 num2"  else   echo "$num1 是否等於 $num2: num1 不等於 num2"  fi  if [ $num1 -ne $num2 ]  then   echo "$num1 是否不等於 $num2: num1 不等於 num2"  else   echo "$num1 是否不等於 $num2 : num1 等於 num2"  fi  if [ $num1 -gt $num2 ]  then   echo "$num1 是否大於 $num2: num1 大於 num2"  else   echo "$num1 是否大於 $num2: num1 不大於 num2"  fi  if [ $num1 -lt $num2 ]  then   echo "$num1 是否小於 $num2: num1 小於 num2"  else   echo "$num1 是否小於 $num2: num1 不小於 num2"  fi  if [ $num1 -ge $num2 ]  then   echo "$num1 是否大於等於 $num2: num1 大於或等於 num2"  else   echo "$num1 是否大於等於 $num2: num1 小於 num2"  fi  if [ $num1 -le $num2 ]  then   echo "$num1 是否小於等於 $num2: num1 小於或等於 num2"  else   echo "$num1 是否小於等於 $num2: num1 大於 num2"  fi

   

操作結果:    
   

➜  ~ ./relation.sh      
     5 是否等於 8: num1 不等於 num2      
     5 是否不等於 8: num1 不等於 num2      
     5 是否大於 8: num1 不大於 num2      
     5 是否小於 8: num1 小於 num2      
     5 是否大於等於 8: num1 小於 num2      
     5 是否小於等於 8: num1 小於或等於 num2

布爾運算符

   

編寫腳本:    
   

  #!/bin/bash  num1=3  num2=23  if [ $num1 != $num2 ]  then   echo "$num1 != $num2 : num1 不等於 num2"  else   echo "$num1 != $num2: num1 等於 num2"  fi  if [ $num1 -lt 25 -a $num2 -gt 15 ]  then   echo "$num1 小於 25 且 $num2 大於 15 : 返回 true"  else   echo "$num1 小於 25 且 $num2 大於 15 : 返回 false"  fi  if [ $num1 -lt 25 -o $num2 -gt 25 ]  then   echo "$num1 小於 25 或 $num2 大於 25 : 返回 true"  else   echo "$num1 小於 25 或 $num2 大於 25 : 返回 false"  fi

   

查看結果:    
   

➜  ~ ./bool.sh      
     3 != 23 : num1 不等於 num2      
     3 小於 25 且 23 大於 15 : 返回 true      
     3 小於 25 或 23 大於 25 : 返回 true

字符串運算符

   

編寫腳本:    
   

  #!/bin/bash  apple="apple"  pen="pen"    if [ $apple = $pen ]  then   echo "$apple = $pen : apple 等於 pen"  else   echo "$apple = $pen: apple 不等於 pen"  fi  if [ $apple != $pen ]  then   echo "$apple != $pen : apple 不等於 pen"  else   echo "$apple != $pen: apple 等於 pen"  fi  if [ -z $apple ]  then   echo "-z $apple : 字符串長度為 0"  else   echo "-z $apple : 字符串長度不為 0"  fi  if [ -n "$apple" ]  then   echo "-n $apple : 字符串長度不為 0"  else   echo "-n $apple : 字符串長度為 0"  fi  if [ $apple ]  then   echo "$apple : 字符串不為空"  else   echo "$apple : 字符串為空"  fi

   

執行結果:    
   

[root@iz2ze0ajic0vbv28hcdctpz ~]# ./string.sh      
     apple = pen: apple 不等於 pen      
     apple != pen : apple 不等於 pen      
     -z apple : 字符串長度不為 0      
     -n apple : 字符串長度不為 0      
     apple : 字符串不為空

邏輯運算符

   

編寫腳本:    
   

  #!/bin/bash  num1=5  num2=8  if [[ $num1 -lt 10 && $num2 -gt 5 ]]  then   echo "返回 true"  else   echo "返回 false"  fi    if [[ $num1 -lt 10 || $num2 -gt 5 ]]  then   echo "返回 true"  else   echo "返回 false"  fi

   

執行結果:    
   

[root@iz2ze0ajic0vbv28hcdctpz ~]# ./logic.sh      
     返回 true      
     返回 true

文件測試運算符

   

編寫腳本:    
   

  ~ cat testfile.sh  #!/bin/bash    file="/root/testfile.sh"    if [ -r $file ]  then   echo "該文件可讀"  else   echo "該文件不可讀"  fi  if [ -x $file ]  then   echo "該文件可執行"  else   echo "該文件不可執行"  fi  if [ -w $file ]  then   echo "該文件可寫"  else   echo "該文件不可寫"  fi    if [ -f $file ]  then   echo "該文件是普通文件"  else   echo "該文件是非普通文件"  fi    if [ -s $file ]  then   echo "該文件為空"  else   echo "該文件不為空"  fi  if [ -d $file ]  then   echo "該文件是目錄"  else   echo "該文件不是目錄"  fi

   

執行腳本:    
   

➜  ~ ./testfile.sh      
     該文件可讀      
     該文件可執行      
     該文件可寫      
     該文件是普通文件      
     該文件為空      
     該文件不是目錄

shell條件判斷&流程控制    
   

其實流程控制的本質是差不多的,只是在語法上稍微有些差別,本節我們來盤一盤。    
   

單分支if    
   

流程示意圖:

   

舉例:    
   

  ➜ if cat if-one.sh  #!/bin/bash  a=10    if [ a > 5 ]  then   echo "a 大於 5"  fi

   

執行結果:    
   

➜  if ./if-one.sh      
     a 大於 5

雙分支if    
   

流程示意圖:

   

舉例:    
   

  ➜ if cat if-double.sh  #!/bin/bash  age=18  if [ $age -ge 18 ]; then   echo "成年"  else   echo "未成年"  fi

   

執行結果:    
   

➜  if ./if-double.sh      
     成年

多分支if語句    
   

流程示意圖:

   

舉例:    
   

  ➜ if cat if-multi.sh  #!/bin/bash  money=10  if [ $money -lt 1 ]  then   echo "1塊錢都沒有的比皮卡丘決定在家吃土"  elif [ $money -ge 1 -a $money -lt 5 ]  then   echo "老闆我要大白兔奶糖"  elif [ $money -ge 5 -a $money -le 10 ]  then   echo "老闆我要巧克力"  else   echo "老闆給我拿個雞腿"  fi

   

執行結果:    
   

➜  if ./if-multi.sh      
     老闆我要巧克力      
   

 


[sl_ivan ] 3000字掃盲shell基礎知識(新手必備)已經有802次圍觀

http://coctec.com/docs/linux/show-post-239799.html