Linux基礎五(shell指令碼)

一隻小呆呆發表於2020-10-21

一、shell

  • 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言

二、編寫shell指令碼

  • 新增註解:
    檔案頭部為#!/bin/bash或#!/bin/sh或不寫,建議寫上
  • 執行方式
    1.sh shell指令碼 例如:sh hello.sh
    2.bash shell指令碼 例如:bash hello.sh
    3.修改許可權為可執行的,然後./shell指令碼(預設是bash) 例如:./hello.sh

1)普通shell指令碼

編寫指令碼
在這裡插入圖片描述
新增註釋,和文字
在這裡插入圖片描述

執行指令碼

在這裡插入圖片描述

2)含變數的指令碼

  • 變數不需要宣告,初始化不需要指定型別,變數可以動態轉換

  • 變數命名:

    • 1:只能使用數字,字母和下劃線,且不能以數字開頭
    • 2:變數名區分大小寫
    • 3:建議變數的名稱要通俗易懂
  • 賦值:變數賦值是通過等號(=)進行賦值,在變數、等號和值之間不能出現空格。

  • 輸出:加上$變數名,也可以使用 ${變數名}

編寫指令碼
在這裡插入圖片描述
加上{}後面可以接著給值在這裡插入圖片描述

執行指令碼
echo $x
在這裡插入圖片描述
echo &{x}這是一個變數
在這裡插入圖片描述
修改變數,不能 ${x}=xx 只能採取以新的變數重新賦值
在這裡插入圖片描述
在這裡插入圖片描述

3)傳參,位置變數

 指令碼中使用位置變數  ($數字) 來進行佔位 等待引數的傳遞
		格式:$數字 獲取某一個位置上的值
		 	 $# 獲取引數的個數,不包括指令碼名
			$* 獲取引數的值
		注意:把指令碼名稱的$0的引數忽略不計
		注意:0開始接收,接收不到就不顯示,可以跳著接收,
			$0永遠都是指令碼名稱
			$數字:數字大於一位數時,需要加上邊界{}

在這裡插入圖片描述
在這裡插入圖片描述

4)字串

在/etc/profile中自定義的變數,在哪裡都能使用

在這裡插入圖片描述
在這裡插入圖片描述
可以看到以字串輸出,並沒有輸出變數的值,要想輸出變數的值,需加上個引用$

在這裡插入圖片描述
在這裡插入圖片描述

  • 單引號:內容按原字串進行輸出
    不能使用轉義符
  • 雙引號:可以引用變數
    可以使用轉義符
  • 沒引號:可以引用變數
    可以使用轉義符
    在這裡插入圖片描述
    單引號報錯在這裡插入圖片描述
    更改
    在這裡插入圖片描述
    在這裡插入圖片描述

1.拼接和字串的長度

拼接:直接引用多個變數
		例如:x=${name}${age}
字串的長度:
		格式:${#變數名}

在這裡插入圖片描述

在這裡插入圖片描述

2.字串的擷取

格式:${變數名:開始位置:擷取長度}

在這裡插入圖片描述

在這裡插入圖片描述

3.字串的替換

		替換第一個出現的字串格式:${變數名/原字串內容/新字串內容}
    	替換所有格式:${變數名//原字串內容/新字串內容}
    	注意:替換不會在原字串上修改

在這裡插入圖片描述
在這裡插入圖片描述

4.字串的刪除

會生成一個新的字串,不會在原字串上發生修改

    	#:從頭開始刪除(匹配第一個)
    		格式:${變數名#條件}
    		例如:${str#*,}:刪除第一個逗號之前包括逗號的所有內容
    	##:從頭開始刪除(匹配最後一個)
    		格式:${變數名##條件}
    		例如:${str##*,}:刪除最後一個逗號之前包括逗號的所有內容
    	%:從尾開始刪除(匹配第一個)
    		格式:${變數名%條件}
    		例如:${str%,*}:刪除第一個逗號之前包括逗號的所有內容
    	%%:從尾開始刪除(匹配最後一個)
    		格式:${變數名%%條件}
    		例如:${str%%,*}:刪除最後一個逗號之前包括逗號的所有內容

在這裡插入圖片描述
在這裡插入圖片描述

5)陣列

儲存多個元素

  	格式:變數名=(元素1 元素2....元素n)
    	操作:${變數名[下標]}
    	注意:${list}直接輸出變數名,結果就是下標為0的值
    	     ${list[*]} 獲取所有的元素
    	獲取個數:
    		${#變數名[*]}

引用陣列,如果不指定下標,預設輸出小標為零的元素
在這裡插入圖片描述

在這裡插入圖片描述

6)基本運算子

算術運算子
注意表示式中各數和運算子之間要加空格隔開

方式1:通過expr這個表示式計算工具
	    	格式:`expr 表示式`
	    	注意:表示式中運算子兩變需要加空格
方式2:通過[]
	    	格式:$[表示式]

支援加減除,不支援*
在這裡插入圖片描述
支援加減乘除
在這裡插入圖片描述
比較運算子:

		格式:[1 符號 值2]
		注意:使用[],符號兩端加不加空格都行,[]兩端加不加都行,不能使用字母(-gt)
			 比較等於時,使用==
			直接引用結果 0表示false 1表示true

在這裡插入圖片描述

7)if語句

  • 判斷條件:四種
    • 1.使用test進行判斷,用於檢測結果是否正確
    • 2.使用[],符號和符號表示式都可以使用,如果使用的是符號需要加上轉義符
      注意:符號和[]兩邊需要加空格
    • 3.使用[[]],符號和符號表示式都可以使用
      注意:符號和[]兩邊需要加空格
    • 4.使用(()),只能使用符號
      注意:符號和()兩邊不需要加空格

判斷方法一

在這裡插入圖片描述
在這裡插入圖片描述
判斷方法二
在這裡插入圖片描述
在這裡插入圖片描述
判斷方法三
判斷方法四
在這裡插入圖片描述
在這裡插入圖片描述

	格式1:if 判斷條件
		then
			執行語句
		 fi
	格式2:
		if 判斷條件
		then
			執行語句
		else
			執行語句
		fi
	格式3:
		if 判斷條件
		then 
			執行語句
		elif 判斷條件
		then
			執行語句
		fi
	如果有兩個判斷條件
		格式:((判斷條件 &  判斷條件))
			((((判斷條件)) &  ((判斷條件))))

8)鍵盤錄入read

格式1:read 變數
格式2:read 變數1 變數2
注意:使用格式2時,鍵盤錄入的需要以空格進行切分
在這裡插入圖片描述
在這裡插入圖片描述
echo輸出預設換行,不換行寫法 echo -n 輸出結果

9)for迴圈

for迴圈:
		格式1:for ((初始化變數;判斷條件;控制語句))
			  do
			  	執行語句
			  done
			例如:for ((i=1;i<=100;i++))
				 do
				 	echo ${i}
				 done
		格式2:for 變數 in 結果集
			  do
			  	執行語句
			  done
			例如:for i in {1..100}
				 do
				 	echo ${i}
				 done

案例:求1到100的奇數和和偶數和

 {開始..結束}:表示開始位置到結束位置所有的數字

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

注意:
       累加的操作:osum=`expr ${i} + ${osum}`
		          osum=$[${i}+${osum}]
		          let osum+=i
		        使用let之後 在引用變數進行計算時,不需要在使用$,+=是進行計算不再是拼接

案例:列印5*5的三角形

在這裡插入圖片描述
在這裡插入圖片描述

10)函式

方法定義:函式名稱(){
				方法體
			}
		方法呼叫:直接使用方法名稱
		引數傳遞:通過$數字,來進行接收,$0永遠是指令碼名稱,方法呼叫時傳遞引數
		返回值:return 
		接收返回值:$?
		注意:return只能return數字 $?接收當前執行的狀態,只接收一次

帶參函式,在函式名後面傳參,有返回值,只接受一次
在這裡插入圖片描述
在這裡插入圖片描述
帶參函式,在執行指令碼後面傳參
在這裡插入圖片描述
在這裡插入圖片描述
無參無返回值
在這裡插入圖片描述
在這裡插入圖片描述

11)日期,定時器

獲取當前日期時間,字母大小寫必須嚴格和下面一樣,模板可以不一樣
		date +"%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" //顯示下一年的日期

12)重定向

重定向:每輸入一個命令都會開啟三個檔案
		標準輸入檔案(stdin):stdin的檔案描述符為0,預設從stdin讀取資料。
		標準輸出檔案(stdout):stdout 的檔案描述符為1,預設向stdout輸出資料。
		標準錯誤檔案(stderr):stderr的檔案描述符為2,向stderr流中寫入錯誤資訊
	重定向時,預設不會把檔案描述符為2,寫入到檔案中,想要寫入
	需要:ll data.txt data1.txt 2>test.txt
	    data.txt存在 data1.txt不存在的
	    ls: 無法訪問data1.txt: 沒有那個檔案或目錄 ---------------2
		-rw-r--r--. 1 root root 6 9月  17 14:09 data.txt-------1
	如果想要把1和2都重定向到檔案中
	需要:ll data.txt data1.txt >test.txt 2>&1
xx > yy   xx 是要寫入的內容,yy是要寫入的檔案

當前目錄下有一個檔案,檔案中的內容為hello
在這裡插入圖片描述
預設將正確資訊寫入新檔案中
在這裡插入圖片描述
要想錯誤的寫入,需加個2

>>>的區別,>> 是追加  > 是覆蓋

在這裡插入圖片描述

想把錯誤的和正確的都寫入
在這裡插入圖片描述
直接將字串追加到檔案中
在這裡插入圖片描述

13)定時器

建立定時任務:crontab -e
執行該指令會開啟一個檔案,在該檔案中寫定時任務
注意裡面的檔案要加絕對路徑
前面為定時的時間

第一個* 代表分鐘  取值範圍0~59
第二個* 代表小時  取值範圍0~23
第三個* 代表日期  取值範圍1~31
第四個* 代表月份  取值範圍1~12
第五個* 代表星期幾  取值範圍0~6 代表星期日
* * * * *  預設為一分鐘執行一次
*/5* * * *5分鐘執行一次
0 * * * *分鐘每到零的時候執行一次,即每小時執行一次
0 0 * * *每個00分執行一次,即每天執行一次
0 0 * * 0每週執行一次
0 0 1 * *每月執行一次
=====================================
0 */2 * * * 每兩小時執行一次
0 23-7/28 * * * 晚上11點到早上8點,每兩小時執行一次
0 11 * * 1-3星期一到星期三的11點執行一次

檢視定時任務的日誌: tail -f /var/log/cron

演示
由於定時執行的命令可能會很長,此處可以編寫shell指令碼,直接在定時器中加上執行指令碼的指令就可
建立一個指令碼
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
將指令碼寫入定時器,實現每分鐘執行一次

在這裡插入圖片描述
在這裡插入圖片描述
檢視定時器日誌
可以看到每隔一分鐘多了一條日誌
在這裡插入圖片描述
檢視data看看定時任務有沒有執行成功

在這裡插入圖片描述
注意:定時器的任務,不用的要及時清了,或者註釋掉,或者每次都會執行,直至磁碟寫滿

清除後再檢視日誌,可以看到日誌不再執行定時任務
在這裡插入圖片描述

java
java入門基礎學習(一)
java入門基礎學習(二)
java入門基礎學習(三)
java入門基礎學習(四)
java入門基礎學習(五)
java入門基礎學習(六)
java入門基礎學習(七)
java入門基礎學習(八)
java入門基礎學習(九)
java入門基礎學習(十)
java入門基礎學習(十一)
java入門基礎學習(十二)
java入門基礎學習(十三)
java入門基礎學習(十四)Maven Git
java總結,題目+筆記
java進階之常見物件(一)
java進階之常見物件(二)
java進階之氣泡排序
java進階之選擇排序
java進階之物件導向(封裝)
java進階之物件導向(程式碼塊、繼承)
java進階之物件導向(多型、抽象、介面)
java進階之匿名內部類、訪問修飾符、包
java進階之io流(位元組流,字元流)
java應用一(反射的應用)
java應用二(配置檔案、工具類)
java應用三(資料庫索引、spring)
java應用四(連線池)
Linux
Linux基礎一
Linux基礎二
Linux基礎三
Linux基礎四
Mysql
mysql一
mysql二
mysql三
mysql四
java連線資料庫
redis
redis一(快取,redis簡介)
redis二(單節點安裝,桌面外掛)
redis三(指令的使用)
redis四(java與redis的連線,基本指令在java中的操作)
redis五(練習)
redis七(持久化)
redis九(叢集安裝)
Hadoop
hadoop學習一
hadoop學習二
hadoop學習三
hadoop學習四
hadoop學習五
hadoop學習六
hadoop學習七
hadoop學習八
hadoop異常處理
hadoop基礎學習九
hadoop基礎學習十
hadoop基礎學習十一
hadoop基礎學習十四
hadoop基礎學習十五

相關文章