Shell基礎


1.Shell概述

Shell 是一個命令行解釋器,它接收應用程序、用戶的命令,然后調用操作系統的內核

Shell還是一個功能強大的編程語言,易編寫,易調試,靈活性強

1.1.Linux中提供的Shell解析器有:

 

[root@master datas]# cat /etc//shells 
/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash

 

1.1 bash和是的關系

[root@master ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh

1.2 Centos默認的解析bash

 

[root@master /]# echo $SHELL
/bin/bash

 

2.Shell腳本基礎

 

2.1 腳本格式

 

shell操作linux的橋梁
    創建:
      后綴為.sh的文件
    編寫:
      頭部注釋為#!/bin/sh或者#!/bin/bash(注釋可寫可不寫,建議寫上)
    運行:
      1.通過sh命令執行
        例如:sh helloworld.sh

#!/bin/bash echo "helloworld"

      2.通過bash命令執行
        例如:bash helloworld.sh
      3.通過把文件修改為可執行的文件然后通過./文件命令.sh來執行
        例如:./helloworld.sh(必須在當前目錄下)

 

2.2系統預定義變量

1)常用系統變量

  $HOME$PWD$SHELL$USER

2)查看系統變量的值

[root@master /]# echo $HOME /root [root@master /]# echo $PWD /

3)顯示當前Shells中所有的變量:set

[root@master /]# set BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostco mplete:interactive_comments:progcomp:promptvars:sourcepathBASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_LINENO=() BASH_SOURCE=()

 

3.自定義變量

 

3.1 基礎語法

 

  (1)定義變量:變量=值

 

  (2)撤銷變量:unset 變量

 

  (3)聲明靜態變量:readonly變量,注意:不能unset

3.2 變量定義規則

 

  (1)變量名稱可以由字母、數字和下划線組成,但是不能以數字開頭,環境變量名建議大寫。

 

  (2)等號兩側不能有空格

 

  (3)在bash中,變量默認類型都是字符串類型,無法直接進行數值運算。

 

  (4)變量的值如果有空格,需要使用雙引號或單引號括起來

 

 

3.3 案列

1)定義和初始化
  格式
    變量名稱=值
  例如:
    x=10 "abc edefg"
注意:
  等號兩邊不能有空格


2)使用:通過$區分變量還是一句話
  格式1:
    $變量
  格式2:
    ${變量}
注意:
  格式1,會把$后所有相連內容看做一個變量
  格式2,${}表示值引用{}之中的內容分,對相連的內容做了一個區分

 

 

4.特殊變量

4.1 $0...$n:表示接收外部參數(執行腳本時,傳遞的參數

  格式:
    $下標
注意:
  $0永遠表示腳本名稱(所以腳本名稱不算數,$0也不算第一個參數)
  下標大於一位數只能使用${}獲取參數,因為$下標只把第一位數據看做下標


  $*獲取所有參數
  $#獲取所有參數個數(數組集合需要使用)

4.2 引號:
  單引號:安原字符串輸出
  雙引號:可以引用變量,擁有特殊含義的內容

  拼接:連續獲取變量
注意:
  如果有多個引號,連續的形成一對
  引號中使用其他引號,其他引號做字符串使用
  # 變量后面的值,可以使用多個成對出現引號包起來
  # 連續的引號是成對的
  # 每對引號之間不能有空格(空格會把值做一個切分,會報錯)


4.3 字符串
1)獲取長度
  格式:
    ${#變量}
2)截取:
  格式:
    ${變量:開始位置:長度}
注意:
      ${str::5}:從0獲取5個
    ${str:0}:從0獲取到末尾
3)替換單個
  格式:
    ${變量/舊/新}
注意:從左向右替換第一個

4)替換所有
  格式:
    ${變量//舊/新}
注意:替換不會再原字符上進行修改,想要修改原字符串只能從新賦值

5)刪除
從頭開始刪除
  ${變量#表達式}:匹配第一個刪除
  ${變量##表達式}:匹配最后一個刪除
從尾開始刪除
  ${變量%表達式}:匹配第一個刪除
  ${變量%%表達式}:匹配最后一個刪除
注意:

  從未開始刪除,表達式還是從左向右去寫
  刪除不會再原字符上進行修改,想要修改原字符串只能從新賦值

#!/bin/sh str="abcadefga" #獲取長度 ${#變量} echo ${#str} #截取  ${變量:開始位置:長度} echo ${str::5} #0-5 echo ${str:0}  #0-最后 #替換單個 ${變量//新} echo ${str/a/b} #從頭開始刪除 #  ${變量#表達式}:匹配第一個刪除 #  ${變量##表達式}:匹配最后一個刪除 #從尾開始刪除 #  ${變量%表達式}:匹配第一個刪除 #  ${變量%%表達式}:匹配最后一個刪除 echo ${str#a} echo ${str##a} echo ${str%a} echo ${str%%a} 
[root@master datas]# sh str.sh 9 abcad abcadefga bbcadefga bcadefga bcadefga abcadefg abcadefg

 

5.字符串

5.1 算數運算符

bash不支持簡單的數學運算,可以通過命令實現expr

  格式1:
    `expr 值 + 值`

注意:符號兩邊需要加上空格

  格式2:
    $[值+值]

#!/bin/sh x=12 y=10 echo `expr 10 + 12` echo $[x+y]

5.2比較運算符

 

格式:
   $[值符號值](符號兩邊空格加不加無所謂)

注意:比較的結果用1(true)和0(false)表示

符號表示:

== 字符串比較

-lt 小於(less than)       -le 小於等於(less equal)

-eq 等於(equal)      -gt 大於(greater than)

-ge 大於等於(greater equal) -ne 不等於(Not equal)

注意:可以用\<,\>,=,==,表示+= 需要用let關鍵字,<=需要雙括號

5.3 邏輯運算符

   &/and   |/or   !/not

 

    例如:
      #判斷2>1結果
        echo $[2 > 1]
      #反轉2>1結果
        echo $[!$[2>1]]
      # 反轉后面的結果2>1 and 2>3 false0
        echo $[!$[$[2>1]&$[2>3]]]
        echo $[2>1 & 2<1]

6.if判斷

 

  格式1:
    if 判斷條件
    then
      判斷為true執行的代碼
    fi
  格式2:
    if 判斷條件
    then
      判斷為true執行的代碼
    else
      判斷為false執行的代碼
    fi
  格式3:
    if 判斷條件
    then
      判斷為true執行的代碼
    elif 判斷條件
    then
    判斷為true執行的代碼
    。。。
    else
    判斷為false執行的代碼
    fi
注意:else可加可不加

#!/bin/sh a=21 b=10 sorce=1
if ((a>b)) then echo "true" fi if((sorce==100)) then echo "滿分" elif ((sorce>=60)) then echo "及格" else echo "不及格" fi

[root@master datas]# sh if1.sh
true
不及格

 

 


判斷條件的寫法
  []:[]兩邊加空格,符號兩邊加空格並且符號前加轉義符
  可以使用字母
  [[]]:[[]]兩邊加空格,符號兩邊加空格
  可以使用字母
  ():棄用
  (()):不需要加空格,但是不能使用字母(建議使用這個)
  在使用變量時,不需要使用$

7.for循環

 

java格式:
    for ((初始化變量;判斷條件;控制語句))

    do
      執行語句
    done

python格式:

    for 變量 in 結果集

    do
      執行語句
    done
結果集:
    {開始..結束}含頭含尾,不能引用變量

    `seq 開始 結束`含頭含尾

 

#!/bin/bash

#九九乘法表 #java格式 for((i=1;i<10;i++)) do for((j=1;j<i+1;j++)) do echo -n "$j*$i "=$[$i*$j] done echo " " done #python 格式 for i in `seq 1 9` do for j  in `seq 1 $i` do echo -n "$j*$i "=$[$i*$j] done echo " " done ~  

 

[root@master datas]# sh for1.sh 1*1 =1 
1*2 =22*2 =4 
1*3 =32*3 =63*3 =9 
1*4 =42*4 =83*4 =124*4 =16 
1*5 =52*5 =103*5 =154*5 =205*5 =25 
1*6 =62*6 =123*6 =184*6 =245*6 =306*6 =36 
1*7 =72*7 =143*7 =214*7 =285*7 =356*7 =427*7 =49 
1*8 =82*8 =163*8 =244*8 =325*8 =406*8 =487*8 =568*8 =64 
1*9 =92*9 =183*9 =274*9 =365*9 =456*9 =547*9 =638*9 =729*9 =81 
1*1 =1 
1*2 =22*2 =4 
1*3 =32*3 =63*3 =9 
1*4 =42*4 =83*4 =124*4 =16 
1*5 =52*5 =103*5 =154*5 =205*5 =25 
1*6 =62*6 =123*6 =184*6 =245*6 =306*6 =36 
1*7 =72*7 =143*7 =214*7 =285*7 =356*7 =427*7 =49 
1*8 =82*8 =163*8 =244*8 =325*8 =406*8 =487*8 =568*8 =64 
1*9 =92*9 =183*9 =274*9 =365*9 =456*9 =547*9 =638*9 =729*9 =81 

 

 

8 .數組

存儲多個元素,數據類型可以不同,元素元素之間以空格切分
  操作
    通過下標獲取數據
  格式:
    $(數組[下標])
注意:
  直接引用數組變量,默認獲取下標為0的元素
  下標使用*表示獲取所有
  獲取長度:
  格式:
  ${#數組[*]}

#!/bin/bash arr=(1 2 3 4 5 6 7 8 9) #通過下標獲取數據 $(數組[下標]) echo $((arr[1])) #獲取長度: ${#數組[*]} echo ${#arr[*]} #遍歷數組 for ((i=0;i<${#arr[*]};i++)) do echo ${arr[i]} done

[root@master datas]# sh arr.sh
2
9
1
2
3
4
5
6
7
8
9

 

 

9. read 鍵盤錄入

 

格式:
  read 變量1 變量2 ...變量n
注意:
  鍵盤錄入時,允許給多個變量進行賦值,值和值之間以空格切分

 

打印三角形

for i in {1..5} do for j in `seq 1 ${i}` do echo -n "* " done echo "" done


10.函數
格式:
  function 方法名(){
    方法體
  return 數字;
  }
注意:

  function和return可加可不加
  $0...$n表示接收參數,$0永遠是腳本名稱(忽略)
  方法的調用直接使用方法名不加()
  return只能返回數字范圍在0-255之間
  $?接收返回值只能接收一次

獲取當前日期時間 ate +"%Y-%m-%d %H:%M:%S" 格式化日期時間: date -d today +"%Y-%m-%d %H:%M:%S" 加減日期時間 date +%Y%m%d //顯示前天年月日 date +%Y%m%d --date="+1 day" //顯示前一天的日期
date +%Y%m%d --date="-1 day" //顯示后一天的日期
date +%Y%m%d --date="-1 month" //顯示上一月的日期
date +%Y%m%d --date="+1 month" //顯示下一月的日期
date +%Y%m%d --date="-1 year" //顯示前一年的日期
date +%Y%m%d --date="+1 year" //顯示下一年的日期

 

重定向:執行命令的結果寫寫入到文件

  標准輸入文件(stdin):stdin的文件描述符為0,默認從stdin讀取數據。
  標准輸出文件(stdout):stdout 的文件描述符為1,默認向stdout輸出數據。
  標准錯誤文件(stderr):stderr的文件描述符為2,向stderr流中寫入錯誤信息。

使用>,>>默認是把正確信息寫入文件
想要把錯誤信息和正確信息寫入文件需要后面追加2>&1(把錯誤信息當做正確信息去處理)

11.定時器:

格式:
    *(分鍾) *(小時) *(星期) *(幾號) *(月份) commend

通過crontab -e添加定時任務
查看定時任務是否執行了,看日志tail -f /var/log/cron

時間周期中可以使用一些輔助字符,如:
  *    表示任何時刻都可以
  ,  若有多個時刻,用逗號分隔
  -     表示一個時刻到另一時刻之間的時間段
  /n   表示每過n個時間單位

  • 比如,*/10 3-6 10,11 * * /home/root/tesh.sh 就表示 每年每月的10號和11號,3點到6點之間,每過10分鍾執行一次tesh.sh

注意:
  定時器或腳本中涉及到路勁的全部給絕對路勁

* * * * * 每分鍾
*/1 * * * * 每分鍾
0 */1 * * * 每小時

每天凌晨2點  0 2 * * *

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM