Day14 01-Shell腳本編程詳解

文章目錄

      • 第一章 Shell編程【重點】
        • 1.1. Shell的概念介紹
          • 1.1.1. 命令解釋器
          • 4.1.1.2. Shell腳本
        • 1.2. Shell編程規范
          • 1.2.1. 腳本文件的結構
          • 1.2.2. 腳本文件的執行
        • 1.3. Shell的變量
          • 1.3.1. 變量的用法
          • 1.3.2. 變量的分類
          • 1.3.3. 局部變量
          • 1.3.4. 環境變量
          • 1.3.5. 位置參數變量
          • 1.3.6. 預定義變量
        • 1.4. read命令
          • 1.4.1. 命令說明
          • 1.4.2. read的實例
          • 1.4.3. 注意事項
        • 1.5. 運算
          • 1.5.1. expr
          • 1.5.2. 示例
          • 1.5.3. {}
        • 1.6. 字符串
          • 1.6.1. 字符串的腳本用法
          • 1.6.2. 字符串的長度
        • 1.7. Shell數組
          • 1.7.1. 數組的使用規則
          • 1.7.2. 數組的定義
          • 1.7.3. 讀取數組
        • 1.8. test測試命令

第一章 Shell編程【重點】

1.1. Shell的概念介紹

1.1.1. 命令解釋器

Shell是命令解釋器(command interpreter),是Unix操作系統的用戶接口,程序從用戶接口得到輸入信息,shell將用戶程序及其輸入翻譯成操作系統內核(kernel)能夠識別的指令,并且操作系統內核執行完將返回的輸出通過shell再呈現給用戶,下圖所示用戶、shell和操作系統的關系:

image-20210411153245838

一個系統可以存在多個shell,可以通過cat /etc/shells命令查看系統中安裝的shell。

[root@qianfeng01 ~]# cat /etc/shells/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

操作系統內核(kernel)與shell是獨立的套件,而且都可被替換;不同的操作系統使用不同的shell; 同一個kernel之上可以使用不同的shell。 也可以查看當前shell環境是哪種:

[root@qianfeng01 ~]# echo $SHELL
4.1.1.2. Shell腳本

Shell也是一門編程語言,即shell腳本。在此腳本中,我們可以使用一些編程語法來進行一些任務操作。 如:變量、類型、分支結構、循環結構、數組、函數等語法。 在shell腳本里,必須指定一種shell命令解釋器。

1.2. Shell編程規范

1.2.1. 腳本文件的結構
1 文件的擴展名必須是.sh
2 文件的首行必須使用#!       指定script的運行shell環境(即腳本解釋器)如:#!/bin/bash
3 腳本里的行注釋符號為#
4 指令、選項、參數之間即使有多個空格仍會被視為一個空格。
5 tab鍵形成的空白也被視為一個空格鍵
6 空白行會被忽略
1.2.2. 腳本文件的執行
  • 使用bash程序調用執行,只需要有讀權限即可

    [root@qianfeng01 ~]# sh *.sh      
    或者
    [root@qianfeng01 ~]# bash *.sh
    
  • 直接寫script,必須要有rx權限才行

    [root@qianfeng01 ~]# ./*.sh         
    絕對路徑寫法: /hadoop/*.sh
    相對路徑寫法: ./*.sh
    
  • 借助變量PATH功能

    將*.sh放入~/bin目錄下,因為PATH里拼接了~/bin目錄。
    注意:~/bin目錄必須自行創建
    

1.3. Shell的變量

1.3.1. 變量的用法
1. 變量的命名規則   - 命名只能使用英文字母,數字和下劃線。首個字符不能以數字開頭。- 字母習慣使用大寫。- 中間不能有空格。- 不能使用標點符號。- 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)2. 變量的使用規則- 直接定義變量名稱,沒有類型需要強調(類似于數學中:x=1,y=2,z=x+y)- 賦值時,"="前后不能有空格- 命令的執行結果賦值給變量時,使用反單引號      如:TIME=`date`- 調用變量時,必須使用$       格式: $變量名    或    ${變量名}
1.3.2. 變量的分類

Linux Shell中的變量可以分為三種變量: 局部變量環境變量特殊變量。可以通過set命令查看系統中存在的所有變量

局部變量:也就是用戶自定義的變量,在腳本中或命令中定義
環境變量:保存和系統操作環境相關的數據。$HOME、$PWD、$SHELL、$USER等等
特殊變量:一種是位置參數變量:主要用來向腳本中傳遞參數或數據,變量名不能自定義,變量作用固定。一種是預定義變量:是Bash中已經定義好的變量,變量名不能自定義,變量作用也是固定的。
1.3.3. 局部變量

用戶自定義的變量由字母或下劃線開頭,由字母,數字或下劃線序列組成,并且大小寫字母意義不同,變量名長度沒有限制。

  • 定義變量

    習慣上用大寫字母來命名變量。變量名以字母表示的字符開頭,不能用數字。
    
  • 調用變量

    在使用變量時,要在變量名前加上前綴“$”.
    使用echo 命令查看變量值
    eg: [root@qianfeng01 ~]# echo $A
    
  • 變量賦值

    • 第一種: 定義時賦值

      # 變量=值
      # 注意: 在上述的定義方式中,等號的左右兩側不能有空格
      # eg:
      [root@qianfeng01 ~]# STR="hello qianfeng"
      [root@qianfeng01 ~]# A=9
      
    • 第二種: 將一個命令的執行結果給變量賦值

      [root@qianfeng01 ~]# A=`ls -la` 反引號,運行里面的命令,并把結果返回給變量A
      [root@qianfeng01 ~]# A=$(ls -la) 等價于反引號
      [root@qianfeng01 ~]# AA=$((4+5))
      [root@qianfeng01 ~]# BB=`expr 4 + 5 `
      
    • 第三種: 將一個變量的值賦給另一個變量

      [root@qianfeng01 ~]# A=$STR
      
  • 變量疊加

    # 變量疊加,就是將兩個字符串變量的值疊加在一起,類似于Java中的字符串拼接操作。[root@qianfeng01 ~]# A=123
    [root@qianfeng01 ~]# C="$A"456
    [root@qianfeng01 ~]# D=${A}789# 單引號和雙引號的區別
    # 現象:單引號里的內容會全部輸出,而雙引號里的內容會有變化
    # 原因:單引號會將所有特殊字符脫意[root@qianfeng01 ~]# NUM=10    [root@qianfeng01 ~]# SUM="$NUM hehe"     
    [root@qianfeng01 ~]# echo $SUM     # 輸出10 hehe[root@qianfeng01 ~]# SUM2='$NUM hehe'     
    [root@qianfeng01 ~]# echo $SUM2    # 輸出$NUM hehe
    
  • 刪除變量

    # 刪除之前已經定義過的變量,之后就無法再使用這個變量了。# 撤銷變量 A
    [root@qianfeng01 ~]# unset A 
    # 聲明靜態的變量 B=2 ,不能 unset
    [root@qianfeng01 ~]# readonly B=2 
    # 報錯: -bash: unset: B: cannot unset: readonly variable
    [root@qianfeng01 ~]# unset B
    
  • 注意事項

    關于局部變量的作用域的問題: 用戶自定義的局部變量,作用于僅為當前的Shell環境。僅在當前的Shell示例中有效,其他的Shell啟動的程序不能訪問局部變量。

    [root@qianfeng01 ~]# echo '#!/bin/bash' > test.sh
    [root@qianfeng01 ~]# A=22
    [root@qianfeng01 ~]# echo 'echo $A' >> test.sh
    [root@qianfeng01 ~]# echo $A   結果:22
    [root@qianfeng01 ~]# bash test.sh   結果:打印為空,因為bash會開啟新的shell進程
    
1.3.4. 環境變量

用戶自定義的局部變量,只能在當前的Shell中生效,而環境變量會在當前Shell和其所有的子Shell中生效。如果把環境變量寫入相應的配置文件,那么這個環境變量就會在所有的Shell中生效。

作用域: 當前的Shell以及所有的子Shell

聲明變量: export 變量名=變量值

定義環境變量的常見配置文件:

  • /etc/profile -> 針對系統所有的用戶生效,此文件應用于所有用戶每次登錄系統時的環境變量定義。每次用戶登錄的時候,都會加載這個文件。
  • $HOME/.bash_profile -> 針對特定用戶生效,HOME/.bash_profile文件中的定義。
1.3.5. 位置參數變量
變量描述
0表示命令本身,9表示第1到第9個參數,10以上的參數需要使用大括號包含,例如${10}
1 n"的形式輸出所有參數
1" “n” 的形式輸出所有參數
$#參數的個數
  • @ 的區別

    • 他們都表示傳遞給函數或腳本的所有參數,不被雙引號包含時,都以 "$1""$2""$3"..."$n"的形式輸出所有參數。
    • 當他們被雙引號包含時
      • "$*"會將所有的參數作為一個整體,以 $1 $2 $3 ... $n 的形式輸出所有的參數。
      • "$@"會將各個參數分開,以 "$1""$2""$3"..."$n" 的形式輸出所有參數。
  • Shell腳本執行測試

    # 執行腳本 test1.sh 
    #!/bin/bash
    echo "test \$*"
    for i in $*
    doecho $i
    doneecho "test \$@"
    for i in $@
    doecho $i
    doneecho "test \"\$*\""
    for i in "$*"
    doecho $i
    doneecho "test \"\$@\""
    for i in "$@"
    doecho $i
    done輸出結果:
    [root@qianfeng01 ~]# sh test1.sh a b
    test $*
    a
    b
    test $@
    a
    b
    test "$*"
    a b
    test "$@"
    a
    b
    
1.3.6. 預定義變量
變量描述
$?執行上一個命令的返回值。執行成功,返回0;執行失敗,返回非0
$$當前進程的進程號(PID),即當前腳本執行時生成的進程號
$!后臺運行的最后一個進程的進程號(PID),最近一個被放入后臺執行的進程
  • 測試 $?

    [root@qianfeng01 ~]# ls ; echo $?
    # 分析: 這里的意思是依次順序執行兩個命令
    # 如果分號前的命令可以執行,$?會返回0; 否則會返回非0的一個數字
    
  • 測試 $$

    [root@qianfeng01 ~]# pwd > /dev/null
    [root@qianfeng01 ~]# echo $$
    
  • 測試 $!

    [root@qianfeng01 ~]# ls /etc > /dev/null &
    [root@qianfeng01 ~]# echo $!
    

1.4. read命令

1.4.1. 命令說明
read命令,可以從控制臺讀取用戶輸入的內容,并且給指定的變量進行賦值。
命令的基本格式為: read [option] variable
常見的option:
-p : 提示語句,在輸入之前,給用戶提示的信息
-n : 限制輸入的字符數量,到達這個數量的字符的時候,會自動的停止輸入
-t : 等待時間,單位為秒。當到達這個等待時間的時候,會自動的結束輸入,并且不會讀取任何輸入的內容!即,輸入操作且回車,必須在指定的時間內完成。
-s : 隱藏輸入的內容。在控制臺上不顯示任何輸入的內容,常見于密碼的輸入
1.4.2. read的實例
[root@qianfeng01 ~]# read -t 30 -p "please input your name:"  NAME[root@qianfeng01 ~]# echo $NAME[root@qianfeng01 ~]# read -s -p "please input your age :"  AGE[root@qianfeng01 ~]# echo $AGE  注意:如果隱藏輸入,這里的結果是看不到的[root@qianfeng01 ~]# read -n 1 -p "please input your sex  [M/F]:"  GENDER[root@qianfeng01 ~]# echo $GENDER
1.4.3. 注意事項
  • 在輸入的時候,如果輸錯了需要刪除的時候,執行ctrl+delete
  • 符號不要輸入中文
  • 變量與之前的內容需要保持有空格

1.5. 運算

1.5.1. expr
格式 :expr m + n 或$((m+n)) 注意expr與運算符和變量間要有空格  sum=$((m+n))=與$之間沒有空格expr命令:對整數型變量進行算術運算(注意:運算符前后必須要有空格)[root@qianfeng01 ~]# expr 3 + 5 [root@qianfeng01 ~]# expr 3 – 5[root@qianfeng01 ~]# echo `expr 10 / 3`     10/3的結果為3,因為是取整[root@qianfeng01 ~]# expr  3  \* 10     \ 是轉義符
1.5.2. 示例

計算(2 +3 )×4 的值

1 .分步計算

[root@qianfeng01 ~]# S=`expr 2 + 3`[root@qianfeng01 ~]# expr $S  \* 4

2.一步完成計算

[root@qianfeng01 ~]# expr  `expr 2 + 3` \* 4
[root@qianfeng01 ~]# S=`expr  \` expr 2 + 3  \`  \* 4`
[root@qianfeng01 ~]# echo $S[root@qianfeng01 ~]# echo $(((2 + 3) * 4))
1.5.3. {}
$()與${}的區別$( )的用途和反引號``一樣,用來表示優先執行的命令eg: [root@qianfeng01 ~]# echo $(ls /root)${ } 就是取變量了  eg:[root@qianfeng01 ~]# echo ${PATH}$((運算內容)) 適用于數值運算eg: [root@qianfeng01 ~]# echo $((3+1*4))

1.6. 字符串

1.6.1. 字符串的腳本用法
- 字符串不能單獨出現,必須要配合變量。
- 字符串可以使用單引號['  '],也可以使用雙引號[" "],也可以不用引號
- 單引號內的任何字符沒有任何意義,都會原樣輸出
- 單引號內使用變量是無效的,單引號內不能出現單引號
- 雙引號內可以使用變量
- 雙引號內可以使用轉義字符
- 在字符串拼接操作時,我們可以進行無縫拼接,或者是在雙引號里使用變量
1.6.2. 字符串的長度
可以使用${#variable} 或者 expr length "${variable}"。因為expr是指令,所以別忘記使用反單引號``或者是$()直接看案例:[root@qianfeng01 ~]# vim test3.sh#!/bin/bash
var='welcome to china'
length1=${#var}
length2=$(expr length "${var}")  <==$()寫法
length3=`expr length "$var"`     <==反單引號寫法

1.7. Shell數組

1.7.1. 數組的使用規則
- 在/bin/bash這個shell中,只有一維數組的概念,并且不限定數組的長度。
- 數組的元素下標是從0開始的,
- 獲取數組的元素要使用下標
- 下標使用不當,會報錯
1.7.2. 數組的定義
定義格式: variable=(值1  值2    …  值n)   
注意:元素之間除了使用空格作為分隔符,還可以使用換行符。或者 name[0]=值1     
name[1]=值2     
…     
name[n]=值n
1.7.3. 讀取數組
${variable[index]}: 讀取index索引上的元素
${variable[*]}或者${variable[@]}:讀取所有元素  
${#variable[*]}或者${#variable[@]} :  讀取數組的長度  
[root@qianfeng01 ~]# vim test3.sh#!/bin/bash
citys=(cc sh bj sd hlj)
hobby[0]=book
hobby[1]=film
hobby[2]=musicecho ${citys[0]}      <==cc
echo ${hobby[*]}      <==book film music
echo ${#hobby[@]}     <==3
[root@qianfeng01 ~]# bash test3.sh

1.8. test測試命令

image-20210411163134487

  • 通常test命令不單獨使用,而是與if語句連用,或是放在循環結構中

    # && 表示測試通過的處理邏輯
    # || 表示測試不通過的處理邏輯
    [root@qianfeng01 ~]# test -e file && echo "exists" || echo "not exists"
    
  • 判斷符號[]

    除了好用的test之外,我們還可以使用中括號來進行檢測條件是否成立

    [root@qianfeng01 ~]# [  -r  filename ]      檢測filename是否有可讀權限
    [root@qianfeng01 ~]# [  -f  filename -a  -r  filename ]     檢測filename是不是普通文件并且有可讀權限
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43632.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43632.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43632.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python入門【內存管理機制、Python緩存機制、垃圾回收機制、分代回收機制】(三十二)

&#x1f44f;作者簡介&#xff1a;大家好&#xff0c;我是愛敲代碼的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列專欄&#xff1a;python入門到實戰、Python爬蟲開發、Python辦公自動化、Python數據分析、Python前后端開發 &#x1f4e7;如果文章知識點有錯誤…

LeetCode150道面試經典題-- 存在重復元素 II(簡單)

1.題目 給你一個整數數組 nums 和一個整數 k &#xff0c;判斷數組中是否存在兩個 不同的索引 i 和 j &#xff0c;滿足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 2.示例 示例 1&#xff1a; 輸…

CSS中的字體屬性有哪些值,并分別描述它們的作用。

聚沙成塔每天進步一點點 ? 專欄簡介? font-style? font-weight? font-size? font-family? font-variant? line-height? letter-spacing? word-spacing? font? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專…

JS中對象數組深拷貝方法

structuredClone() JavaScript 中提供了一個原生 API 來執行對象的深拷貝&#xff1a;structuredClone。它可以通過結構化克隆算法創建一個給定值的深拷貝&#xff0c;并且還可以傳輸原始值的可轉移對象。 當對象中存在循環引用時&#xff0c;仍然可以通過 structuredClone()…

過濾字符,繞過

構造不包含字母和數字的webshell <?phpecho "A"^""; ?>運行結果為! 代碼中對字符"A"和字符”"進行了異或操作。在PHP中&#xff0c;兩個變量進行異或時&#xff0c;先會將字符串轉換成ASCII值&#xff0c;再將ASCII值轉換成二進制…

容器docker安裝及應用

目錄 二進制安裝docker應用啟動docker拉取鏡像查看當前主機鏡像查看鏡像詳細信息運行容器 二進制安裝docker 環境 centos 7 [rootlocalhost ~]# mkdir /data [rootlocalhost ~]# wget -P /data/ https://download.docker.com/linux/static/stable/x86_64/docker-18.03.1-ce.t…

【聲波】聲波在硼酸、硫酸鎂 (MgSO4) 和純水中的吸收研究(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

MAC 命令行啟動tomcat的詳細介紹

MAC 命令行啟動tomcat MAC 命令行啟動tomcat的詳細介紹 一、修改授權 進入tomcat的bin目錄,修改授權 1 2 3 ? bin pwd /Users/yp/Documents/workspace/apache-tomcat-7.0.68/bin ? bin sudo chmod 755 *.sh sudo為系統超級管理員權限.chmod 改變一個或多個文件的存取模…

2.js中attr()用來修改或者添加屬性或者屬性值

attr()可以用來修改或者添加屬性或者屬性值 例&#xff1a;<input type"button" class"btn btn-info" id"subbtn" style"font-size:12px" value"我也說一句"/>1.如果想獲取input中value的值 $(#subbtn).attr(value);…

ASP.NET Core中路由規則匹配

RESTful約束&#xff0c;如果在一個控制器里面有多個Get、Post...的操作 1、在一個控制器里面可以定義多個API方法 2、通過路由規則來區分 /// <summary> /// 獲取用戶信息 /// </summary> /// <param name"user"></param> /// <returns…

c++ | 字節轉換 | 字長 | 機器位數

為什么有的時候腦子轉不過來&#xff1f;&#xff1f; 為什么要對字節、機器長啊、位啊都要門清 位數 一般的就是指計算機的位數&#xff0c;比如64位/32位&#xff0c;更簡單的理解&#xff0c;計算機就是在不停的做二進制的計算&#xff0c;比如32位計算機&#xff0c;在長…

[保研/考研機試] KY26 10進制 VS 2進制 清華大學復試上機題 C++實現

題目鏈接&#xff1a; 10進制 VS 2進制http://www.nowcoder.com/share/jump/437195121691738172415 描述 對于一個十進制數A&#xff0c;將A轉換為二進制數&#xff0c;然后按位逆序排列&#xff0c;再轉換為十進制數B&#xff0c;我們稱B為A的二進制逆序數。 例如對于十進制…

算法基礎課——基礎算法(模板整理)

快速排序 快速排序 #include <iostream> #include <algorithm> using namespace std; int n; int s[100000]; int main() {cin>>n;for(int i0;i<n;i){cin>>s[i];}sort(s,sn);for(int i0;i<n;i){cout<<s[i]<<" ";}cout<…

4.物聯網LWIP之C/S編程

LWIP配置 服務器端實現 客戶端實現 錯誤分析 一。LWIP配置&#xff08;FREERTOS配置&#xff0c;ETH配置&#xff0c;LWIP配置&#xff09; 1.FREERTOS配置 為什么要修改定時源為Tim1&#xff1f;不用systick&#xff1f; 原因&#xff1a;HAL庫與FREERTOS都需要使用systi…

leetcode做題筆記89. 格雷編碼

n 位格雷碼序列 是一個由 2n 個整數組成的序列&#xff0c;其中&#xff1a; 每個整數都在范圍 [0, 2n - 1] 內&#xff08;含 0 和 2n - 1&#xff09;第一個整數是 0一個整數在序列中出現 不超過一次每對 相鄰 整數的二進制表示 恰好一位不同 &#xff0c;且第一個 和 最后一…

C語言好題解析(三)

目錄 選擇題一選擇題二選擇題三選擇題四編程題一編程題二 選擇題一 以下程序段的輸出結果是&#xff08;&#xff09;#include<stdio.h> int main() { char s[] "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; }A: 12 B: 13 …

Lnton羚通關于【PyTorch】教程:torchvision 目標檢測微調

torchvision 目標檢測微調 本教程將使用Penn-Fudan Database for Pedestrian Detection and Segmentation 微調 預訓練的Mask R-CNN 模型。 它包含 170 張圖片&#xff0c;345 個行人實例。 定義數據集 用于訓練目標檢測、實例分割和人物關鍵點檢測的參考腳本允許輕松支持添加…

前端-輪詢

一、輪詢定義 輪詢是指在一定的時間間隔內&#xff0c;定時向服務器發送請求&#xff0c;獲取最新數據的過程。輪詢通常用于從服務器獲取實時更新的數據。 二、輪詢和長輪詢區別 輪詢是在固定的時間間隔內向服務器發送請求&#xff0c;即使服務器沒有數據更新也會繼續發送請求…

暴力模擬入門+簡單:零件組裝、塔子的簽到題、塔子哥考試、平均像素值、換座位

暴力模擬入門 P1038 小紅書-2022.9.23-零件組裝 #include <bits/stdc.h> #include <cstdint> using namespace std;typedef long long LL; const int N 100001; int num[4]; LL d; vector<vector<LL>> v(4, vector<LL>(N));int main() {for(in…

解決Pycharm的Settings中Project不見了也無法選擇Python Interpreter的方法

目錄 一、問題如下二、解決方法 一、問題如下 突然打開項目沒有python解釋器&#xff0c;也無法重新配置python Interpreter&#xff0c;而且整個文件夾是黃色高亮的形式&#xff0c;如下顯示&#xff0c;而且重新安裝了pycharm也沒用甚至說打開File–>Setting–>Projec…