1、 SHELL  變數及運用

1)shell變數

變數是shell傳遞資料的一種方法。變數是用來代表每個值的符號名,透過變數,可以在記憶體中儲存資料,也可以在指令碼執行中進行修改和訪問儲存的資料。

2)變數設定規則

A、變數名稱通常是大寫字母,它可以由數字、字母(大小寫)和下劃線_組成。變數名區分大小寫;變數名稱不能以數字開頭;

B、等號 = 用於為變數分配值,在使用過程中等號兩邊不能有空格;

C、變數儲存的資料型別是整數值和字串值;

D、在對變數賦於字串值時,建議大家用引號將其括起來。因為如果字串中存在空格隔符號。需要使用單引號或雙引號;

E、要對變數進行呼叫,可以在變數名稱前加美元符號$;

F、如果需要增加變數的值,那麼可以進行變數值的疊加。不過變數需要用雙引號包含“$變數名”或用${變數名}包含;

3)變數分類

按照變數的作用可以分成4類:

A、使用者自定義變數;

B、環境變數:這種變數中主要儲存的是和系統操作環境相關的資料;

C、位置引數變數:這種變數主要是用來向指令碼當中傳遞引數或資料的,變數名不能自定義,變數作用是固定的;

E、預定義變數:是 Bash 中已經定義好的變數,變數名不能自定義,變數作用也是固定的。

按照變數作用範圍分為2類:

A、區域性變數是 shell 程式內部定義的,其使用範圍僅限於定義它的程式,對其它程式不可見。包括:使用者自定義變數、位置變數和預定義變數。

B、全域性變數是環境變數,其值不隨 shell 指令碼的執行結束而消失。

4)使用者自定義變數

變數名命名規則:由字母或下劃線打頭,不允許數字開頭,後面由字母、數字或下劃線組成,並且大小寫字母意義不同。在使用變數時,在變數名前加$。

Eg1:給變數test賦值

[root@test65-1 ~]# test=1 [root@test65-1 ~]# echo $test1[root@test65-1 ~]#

Eg2:變數值疊加,使用${}

$name 是${name}的簡化版本,但是在某些情況下,還必須使用花括號引起的方式來消除歧義並避免意外的結果。

[root@test65-1 ~]# test1=access[root@test65-1 ~]# echo test1test1[root@test65-1 ~]# echo $test1access[root@test65-1 ~]# echo $test1.logaccess.log[root@test65-1 ~]#

5)命令替換

Date命令:

date 命令是顯示或設定系統時間與日期。

-s<字串>:根據字串來設定日期與時間。字串前後必須加上雙引號;

<+時間日期格式>:指定顯示時,使用特定的日期時間格式

例項:

A、 顯示當前時間年、月、日

[root@test65-1 ~]# date +"%Y-%m-%d"2020-10-12

B、 顯示當前時間年、月

[root@test65-1 ~]# date +"%Y-%m"2020-10

#顯示日期及時間

date +"%Y-%m-%d %H:%M.%S"

#顯示日期及時間,使用/分割

date +"%Y/%m/%d %H/%M/%S"

#顯示日期及時間,使用-進行分割(備份一般使用該方式)

date +"%Y-%m-%d-%H-%M-%S"

Date命令加減操作:

#顯示當前時間(年、月、日)

date +"%Y%m%d"

#顯示明天的日期

date -d "+1 day" +%Y%m%d

#顯示昨天的日期

date -d "-1 day" +%Y%m%d

#顯示上一月的日期

date -d "-1 month" +%Y%m%d

#顯示下一月的日期

date -d "+1 month" +%Y%m%d

#顯示前一年的日期

date -d "-1 year" +%Y%m%d

#顯示下一年的日期

date -d "+1 year" +%Y%m%d

設定時間:

#設定成20201020,這樣會把具體時間設定成空 00:00:00

date -s 20201020

#設定具體時間,不會對日期做更改

date -s 15:10:20

#設定全部時間

date -s "2020-10-20 15:10:20"

A、命令中呼叫date命令

[root@test65-1 ~]# echo date  #只顯示date值date[root@test65-1 ~]# echo $date #date變數未賦值
 [root@test65-1 ~]# echo `date` #呼叫date命令成功Mon Oct 12 09:59:18 CST 2020[root@test65-1 ~]# echo $(date) #呼叫date命令成功Mon Oct 12 09:59:39 CST 2020[root@test65-1 ~]# dateMon Oct 12 10:02:10 CST 2020

6)命令的巢狀使用,使用$( $( ))

[root@test65-1 ~]# find /home/ -name *.log[root@test65-1 ~]# testtar=$(tar -zcvf home.tar.gz $(find /root/ -name *.txt))[root@test65-1 ~]# echo $testtar

7)shell 中單引號和雙引號區別

‘’ 在單引號中所有的字元包括特殊字元($,'',`和\)都將解釋成字元本身而成為普通字元。

“” 在雙引號中,除了$, '', `和\以外所有的字元都解釋成字元本身,擁有“呼叫變數的值”、“引用命令”和“轉義符”的特殊含義。

注:\轉義符,跟在\之後的特殊符號將失去特殊含義,變為普通字元。如\$將輸出“$”符號,而不當做是變數引用。

Eg:\轉義符作用

[root@test65-1 home]# test=1[root@test65-1 home]# echo $test1[root@test65-1 home]# echo \#test#test[root@test65-1 home]# echo \$test$test[root@test65-1 home]#

A、雙引號與單引號區別

[root@test65-1 home]# test=1[root@test65-1 home]# test1=2[root@test65-1 home]# echo '$test+$test1'$test+$test1[root@test65-1 home]# echo "$test+$test1"1+2[root@test65-1 home]#

注:單引號之間的內容原封不動賦值給變數,雙引號之間的內容如有特殊符號會保留它的特殊含義。

刪除變數:

[root@test65-1 home]# unset test[root@test65-1 home]# echo $test
 [root@test65-1 home]#

8)環境變數

 bash shell 中,變數分為兩類:全域性變數和區域性變數

全域性變數:對於shell會話和所有的子shell都是可見的

區域性變數:它只在自己的程式當中使用

A、區域性變數

[root@test65-1 home]# test=1 [root@test65-1 home]# vi 1.sh#!/bin/bashecho $test[root@test65-1 home]# sh 1.sh 
 [root@test65-1 home]# echo $test1

#執行1.sh 時,會使用另一個bash去執行,就訪問不到$test的值

B、env 命令檢視所全域性變數

[root@test65-1 ~]# env[root@test65-1 ~]# env | grep PATHPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

C、使用 export 把這個區域性變數輸出為全域性變數

[root@test65-1 ~]# export test=1[root@test65-1 ~]# echo $test1[root@test65-1 ~]# sh 1.sh 1[root@test65-1 ~]#

D、讓變數永久生效,可以把定義好的變數寫入配置檔案

當登入系統或新開啟一個 ssh 連線啟動 bash 程式時,一定會載入這 4 個配置檔案:

#系統全域性環境和登入系統的一些配置

[root@test65-1 ~]# vim /etc/profile

#shell 全域性自義配置檔案,用於自定義 shell

[root@test65-1 ~]# vim /etc/bashrc

#用於單獨自定義某個使用者的 bash

[root@test65-1 ~]# vim /root/.bashrc

#使用者單獨自定義某個使用者的系統環境

[root@test65-1 ~]# vim /root/.bash_profile

9)shell位置變數

Shell解釋執行使用者的命令時,將命令列的第一個字元作為命令名,而其它字元作為引數。

$0 獲取當前執行shell指令碼的檔案檔名,包括指令碼路徑,命令本身

$n 獲取當前指令碼的第n個引數 n=1,2.....n 當 n 大於 9 時 用${10}表示

Eg:

[root@test65-1 ~]# vim test.sh#!/bin/bashecho "本 shell 指令碼的檔名: $0"echo "第 1 個引數: $1"echo "第 2 個引數: $2"echo "第 3 個引數: $3"echo "第 4 個引數: $4"[root@test65-1 ~]# chmod +x print.sh[root@test65-1 ~]# ./test.sh 1 2 3 4本 shell 指令碼的檔名: ./test.sh
第 1 個引數: 1
第 2 個引數: 2
第 3 個引數: 3
第 4 個引數: 4[root@test65-1 ~]#

10)特殊變數

有些變數是一開始執行 Script 指令碼時就會設定,且不能被修改,但我們不叫它只讀的系統變數,而叫它特殊變數。這些變數當一執行程式時就有了,以下是一些特殊變數:

$* 以一個單字串顯示所有向指令碼傳遞的引數;如"$*"用雙引號括起來的情況、以"$1 $2 … $n"的形式輸出所有引數$n  第n個引數值,n=1..9
$#  傳遞到指令碼的引數個數$$  當前程式的程式號 PID$?  顯示最後命令的退出狀態;0 表示沒有錯誤,其他任何值表明有錯誤$!  後臺執行的最後一個程式的程式號 pid

Eg:

[root@test65-1 ~] vim  test.sh#!/bin/bashecho "$* 表示這個程式的所有引數"echo "$# 表示這個程式的引數個數"echo "$$ 表示程式的程式 ID"touch /tmp/b.txt &echo "$! 執行上一個後臺指令的 PID"echo "$$ 表示程式的程式 ID"echo "$? 表示上一個程式執行返回結果 "
 [root@test65-1 ~]# sh test.sh  testtest 表示這個程式的所有引數
1 表示這個程式的引數個數
1684 表示程式的程式 ID
1685 執行上一個後臺指令的 PID
1684 表示程式的程式 ID
0 表示上一個程式執行返回結果[root@test65-1 ~]#