學習筆記:CentOS7學習之二十:shell腳本的基礎


學習筆記:CentOS7學習之二十:shell腳本的基礎


本文用於記錄學習體會、心得,兼做筆記使用,方便以后復習總結。內容基本完全參考學神教育教材,圖片大多取材自學神教育資料,在此非常感謝MK老師和學神教育的優質教學。希望各位因學習需求而要進行轉載時,能申明出處為學神教育,謝謝各位!


20.1 shell 基本語法

20.1.1 什么是shell?

Shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶進行對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕反饋給用戶。這種對話方式可是交互也可以是非交互式的,如下圖所示:

我們所輸入的命令計算機是不識別的,這時就需要一種程序來幫助我們進行翻譯,變成計算機能識別的二進制程序,同時又把計算機生成的結果返回給我們。

20.1.2 編程語言分類

編程語言主要用:低級語言和高級語言

  1. 低級語言:

機器語言:二進制語言

匯編語言:符號語言,使用助記符來代替操作碼,也就是用符號代替機器語言的二進制碼

它們都是面向機器的語言

  1. 高級語言:

它是比較接近自然語言或者說人類語言的一種編程,用人們能夠容易理解的方式進行編寫程序,

靜態語言:編譯型語言 如:c 、 c++ 、 java,

動態語言:解釋型語言 如: php 、 shell 、 python 、 perl

gcc編譯器:(解釋器) 將人類理解的語言翻譯成機器理解的語言

20.1.3 什么是shell腳本

shell腳本:就是說我們把原來linux命令或語句放在一個文件中,然后通過這個程序文件去執行時,我們就說這個程序為shell腳本或shell程序;我們可以在腳本中輸入一系統的命令以及相關的語法語句組合,比如變量,流程控制語句等,把他們有機結合起來就形成了一個功能強大的shell腳本

舉例:
編寫一個簡單的腳本程序test.sh


[root@centos-7-24 ~]# vim test.sh
#!/bin/bash

#This is shell

echo "hello world"
mkdir /tmp/test
touch /tmp/test/a.txt

注釋:

1、!/bin/bash 作用:告訴腳本使用的是哪種命令解釋器。如不指shell,以當前shell作為執行的shell。

2、在shell中以#表示開頭,整個行就被當作一個注釋。執行時被忽略。

3、shell程序一般以.sh結尾


[root@centos-7-24 ~]# chmod +x test.sh #給用戶root賦予test.sh可執行權限
[root@centos-7-24 ~]# ./test.sh #執行腳本
hello world
[root@centos-7-24 ~]# ll /tmp/test/ #查看腳本運行結果
總用量 0
-rw-r--r--. 1 root root 0 6月  25 22:19 a.txt

創建shell程序的步驟:

第一步:創建一個包含命令和控制結構的文件。

第二步:修改這個文件的權限使它可以執行。使用chmod +x test.sh

第三步:檢測語法錯誤

第四步:執行 ./example

shell腳本的執行通常有以下幾種方式

  • /root/test.sh 或者 ./test.sh (當前路徑下執行腳本的話要有執行權限chmod +x test.sh)
  • bash test.sh 或 sh test.sh (這種方式可以不對腳本文件添加執行權限)
  • source test.sh (可以沒有執行權限)
  • sh < test.sh 或者 cat test.sh |sh(bash)

20.2 SHELL變量及運用

20.2.1 shell變量

變量是shell 傳遞數據的一種方法。變量是用來代表每個值的符號名。我們可以把變量當成一個容器,通過變量,可以在內存中存儲數據。也可以在腳本執行中進行修改和訪問存儲的數據

變量的設置規則:

  1. 變量名稱通常是大寫字母,它可以由數字、字母(大小寫)和下划線_組成。變量名區分大小寫;但是大家要注意變量名稱不能以數字開頭
  2. 等號 = 用於為變量分配值,在使用過程中等號兩邊不能有空格
  3. 變量存儲的數據類型是整數值和字符串值
  4. 在對變量賦於字符串值時,建議大家用引號將其括起來。因為如果字符串中存在空格隔符號。需要使用單引號或雙引號
  5. 要對變量進行調用,可以在變量名稱前加美元符號$
  6. 如果需要增加變量的值,那么可以進行變量值的疊加。不過變量需要用雙引號包含“\(變量名”或用\){變量名}包含

變量的分類:

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

  1. 用戶自定義變量
  2. 環境變量:這種變量中主要保存的是和系統操作環境相關的數據。
  3. 位置參數變量:這種變量主要是用來向腳本當中傳遞參數或數據的,變量名不能自定義,變量作用是固定的。
  4. 預定義變量:是Bash中已經定義好的變量,變量名不能自定義,變量作用也是固定的。

按照變量作用域可以分成2類:全局變量和局部變量。

  • 局部變量是shell 程序內部定義的,其使用范圍僅限於定義它的程序,對其它程序不可見。包括:用戶自定義變量、位置變量和預定義變量。
  • 全局變量是環境變量,其值不隨shell 腳本的執行結束而消失。

20.2.2 用戶定義變量

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

例1:給var1賦值:

[root@centos-7-24 ~]# var1=123
[root@centos-7-24 ~]# echo $var1
123

例2:錯誤的賦值方式,不允許數字開頭,等號兩邊不能有空格


[root@centos-7-24 ~]# var2= 456
bash: 456: 未找到命令...
[root@centos-7-24 ~]# var2 =456
bash: var2: 未找到命令...
[root@centos-7-24 ~]# var2 = 456
bash: var2: 未找到命令...
[root@centos-7-24 ~]# 3var2=456
bash: 3var2=456: 未找到命令...

例3:變量值的疊加,使用${}

\(name是\){name}的簡化版本,但是在某些情況下,還必須使用花括號引起的方式來消除歧義並避免意外的結果。因此建議使用${name}調用變量值,如下例所示:


[root@centos-7-24 ~]# VAR4=mysql
[root@centos-7-24 ~]# echo $VAR4
mysql
[root@centos-7-24 ~]# echo $VAR4-DB.LOG
mysql-DB.LOG
[root@centos-7-24 ~]# echo $VAR4.db.log
mysql.db.log
[root@centos-7-24 ~]# echo $VAR4db.log #輸出錯誤,因為系統將VAR4db認為成了一個變量,但是這個變量並沒有賦值
.log
[root@centos-7-24 ~]# echo ${VAR4}db.log #使用${name}消除歧義后,輸出正常
mysqldb.log


20.2.3 命令的替換,使用$()或反引號

例1:在命令就調用date命令

擴展:date命令是顯示或設置系統時間與日期。

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

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


[root@centos-7-24 ~]# date +"%Y-%m-%d" #顯示年月日
2019-06-25
[root@centos-7-24 ~]# date +"%Y-%m" #只顯示年月
2019-06
[root@centos-7-24 ~]# date +"%Y-%m-%d %H:%M.%S" #顯示年月日小時分秒
2019-06-25 22:35.01
[root@centos-7-24 ~]# date +"%Y-%m-%d %H:%M:%S" #以-分割顯示年月日等格式
2019-06-25 22:35:11
[root@centos-7-24 ~]# date +"%Y/%m/%d/%H/%M/%S"
2019/06/25/22/40/16
[root@centos-7-24 ~]# date +"%y-%m-%d_%H-%M-%S" 
bash: date%y-%m-%d_%H-%M-%S: 未找到命令...
[root@centos-7-24 ~]# date +"%y-%m-%d_%H-%M-%S" #%y顯示2位年份
19-06-25_22-42-52
[root@centos-7-24 ~]# date -d "+1 day" +"%y-%m-%d" #顯示后一天的日期
19-06-26
[root@centos-7-24 ~]# date -d "+1 day" +"%y-%m-%d"
19-06-26
[root@centos-7-24 ~]# date -d "-1 day" +"%y-%m-%d" #顯示前一天的日期
19-06-24
[root@centos-7-24 ~]# date -d "1 day ago" +"%y-%m-%d" #顯示前一天的日期
19-06-24
[root@centos-7-24 ~]# date -d "+1 month" +"%y-%m-%d" #顯示后一月的日期
19-07-25
[root@centos-7-24 ~]# date -d "+1 year" +"%y-%m-%d" #顯示后一年的日期
20-06-25

設定時間:

  • date -s 20180523 #設置成20120523,這樣會把具體時間設置成空00:00:00
  • date -s 01:01:01 #設置具體時間,不會對日期做更改
  • date -s "2018-05-23 01:01:01" #這樣可以設置全部時間

例1: 在命令中調用date命令輸出值


[root@centos-7-24 ~]# echo `date -d "-7 day" +"%Y%m%d"`
20190618
[root@centos-7-24 ~]# echo $(date -d "-7 day" +"%Y%m%d")
20190618

20.2.4 命令的嵌套使用\((\)())


[root@centos-7-24 ~]# find /root/ -name "*.txt"
/root/j.txt
/root/k.txt
/root/m.txt
/root/n.txt
/root/p.txt
/root/q.txt
/root/s.txt
/root/t.txt
/root/v.txt
/root/w.txt
/root/y.txt
/root/z.txt
/root/a.txt
/root/b.txt
/root/c.txt
/root/d.txt
/root/e.txt
/root/f.txt
/root/g.txt
/root/h.txt
/root/i.txt
/root/l.txt
/root/o.txt
/root/r.txt
/root/u.txt
/root/x.txt
[root@centos-7-24 ~]# var6=$(tar -czvf root.tar.gz $(find /root/ -name "*.txt"))
tar: 從成員名中刪除開頭的“/”
[root@centos-7-24 ~]# echo $var6
/root/j.txt /root/k.txt /root/m.txt /root/n.txt /root/p.txt /root/q.txt /root/s.txt /root/t.txt /root/v.txt /root/w.txt /root/y.txt /root/z.txt /root/a.txt /root/b.txt /root/c.txt /root/d.txt /root/e.txt /root/f.txt /root/g.txt /root/h.txt /root/i.txt /root/l.txt /root/
o.txt /root/r.txt /root/u.txt /root/x.txt

20.2.5 shell中雙引號和單引號的區別

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

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

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

例1:使用\進行轉義


[root@centos-7-24 ~]# echo $var1
123
[root@centos-7-24 ~]# echo \$var1 #使用\轉義后,$變為普通字符
$var1

例2:賦值時單引號和雙引號的區別


[root@centos-7-24 ~]# echo 'yg YG $var1'
yg YG $var1
[root@centos-7-24 ~]# echo "yg YG $var1"
yg YG 123
#注:單引號之間的內容原封不動賦值給變量,	雙引號之間的內容如有特殊符號會保留它的特殊含義

刪除變量


[root@centos-7-24 ~]# unset var1
[root@centos-7-24 ~]# echo $var1


20.2.6 環境變量

在bash shell中,環境變量分為兩類:全局變量和局部變量

全局變量:對於shell會話和所有的子shell都是可見的

局部變量: 它只在自己的進程當中使用

例1:局部變量


[root@centos-7-24 ~]# var1=123
[root@centos-7-24 ~]# echo $var1
123
[root@centos-7-24 ~]# vim a.sh
#!/bin/bash

echo $var1
~             
[root@centos-7-24 ~]# bash a.sh #執行a.sh 時,會使用另一個bash去執行,就訪問不到var1的值
	

例2:env命令查看所全局變量


[root@centos-7-24 ~]# env |grep PATH
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
QT_PLUGIN_PATH=/usr/lib64/kde4/plugins:/usr/lib/kde4/plugins


例3:使用export把這個局部變量輸出為全局變量


[root@centos-7-24 ~]# var1=yg 
[root@centos-7-24 ~]# export var1 #設置var1為全局變量
[root@centos-7-24 ~]# bash a.sh #引用全局變量成功
yg

互動: 雖然我們設置了export全局變量,但是新開的xshell連接中,依然還是讀不到變量VAR1,可以通過將全局變量寫入配置文件讓其生效

例3:讓變量永久生效,可以把定義好的變量寫入配置文件

當登錄系統或新開啟一個ssh連接啟動bash進程時,一定會加載這4個配置文件:

  • /etc/profile #系統全局環境和登錄系統的一些配置
  • /etc/bashrc #shell全局自義配置文件,用於自定義shell
  • /root/.bashrc #用於單獨自定義某個用戶的bash
  • /root/.bash_profile #用戶單獨自定義某個用戶的系統環境

下面開始插入永久變量:


[root@centos-7-24 ~]# vim /etc/profile
export VAR9=yg 
[root@centos-7-24 ~]# source /etc/profile

新打開的鏈接中,也有了,如下所示:

20.2.7 設置PATH環境變量

SHELL要執行某一個程序,它要在系統中去搜索這個程序的路徑,path變量是用來定義命令和查找命令的目錄,當我們安裝了第三方程序后,可以把第三方程序bin目錄添加到這個path路徑內,就可以在全局調用這個第三方程序的

[root@centos-7-24 ~]# vim /opt/backup.sh
#!/bin/bash
echo "Backup data is OK!"
[root@centos-7-24 ~]# chmod +x /opt/backup.sh 
[root@centos-7-24 ~]# /opt/backup.sh #添加全路徑可以執行腳本
Backup data is OK!
[root@centos-7-24 ~]# backup.sh #不添加路徑執行無效
bash: backup.sh: 未找到命令...

將backup.sh的路徑添加添加PATH中

[root@centos-7-24 ~]# PATH=/opt/:$PATH 
[root@centos-7-24 ~]# backup.sh #發現命令可以直接執行了,不用寫全路徑了
Backup data is OK!
[root@centos-7-24 ~]# vim /etc/profile # 在文件最后追加以下內容,永久生效
[root@centos-7-24 ~]# vim /etc/profile
[root@centos-7-24 ~]# source /etc/profile #重新加載配置文件,使用配置生效
[root@centos-7-24 ~]# backup.sh 
Backup data is OK!

20.2.8 shell位置變量

Shell解釋執行用戶的命令時,將命令行的第一個字符作為命令名,而其它字符作為參數。

$0 獲取當前執行shell腳本的文件文件名,包括腳本路徑,命令本身

\(n 獲取當前腳本的第n個參數 n=1,2.....n 當n大於9時 用\){10}表示。

舉例:


[root@centos-7-24 tmp]# vim print.sh
#!/bin/bash

echo "本shell腳本的文件名:$0"
echo "\$1 是第一個參數:$1"
echo "\$2 是第二個參數:$2"
echo "\$3 是第一個參數:$3"
echo "\$4 是第一個參數:$4"

[root@centos-7-24 tmp]# chmod +x print.sh
[root@centos-7-24 tmp]# ./print.sh 111 222 a.txt 444
本shell腳本的文件名:./print.sh
$1 是第一個參數:111
$2 是第二個參數:222
$3 是第一個參數:a.txt
$4 是第一個參數:444

20.2.9 特殊變量

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

變量名 說明
$* 以一個單字符串顯示所有向腳本傳遞的參數;
如"$*"用【"】括起來的情況、以"$1 $2 … $n"的形式輸出所有參數
$# 傳遞到腳本的參數個數
$$ 當前進程的進程號PID
$? 顯示最后命令的退出狀態;0表示沒有錯誤,其他任何值表明有錯誤
$! 后台運行的最后一個進程的進程號pid

例子:


[root@centos-7-24 tmp]# vim special_varliable.sh
#!/bin/bash

echo "$* 表示這個程序的所有參數"
echo "$# 表示這個程序的參數個數"

echo "$$ 表示程序的進程ID"

touch /tmp/b.txt & #最后的&表示程序后台運行
echo "$! 表示執行上一個后台進程的pid"
echo "$$ 表示程序的進程ID"
echo "$? 表示上一個程序的返回結果"
                                                                                                                                                                                                                                                                                                                
[root@centos-7-24 tmp]# chmod +x special_varliable.sh 
[root@centos-7-24 tmp]# ./special_varliable.sh 11 22 33 44 55
11 22 33 44 55 表示這個程序的所有參數
5 表示這個程序的參數個數
25614 表示程序的進程ID
25615 表示執行上一個后台進程的pid
25614 表示程序的進程ID
0 表示上一個程序的返回結果

例2:常用的環境變量


[root@centos-7-24 tmp]# echo $HOME
/root
[root@centos-7-24 tmp]# echo $PATH
/opt/:/opt/:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos-7-24 tmp]# echo $PWD
/tmp


20.3 數學運算

20.3.1 expr命令

(1)對數字的基本計算,做比較時,輸出結果假為0,1為真;特殊符號用轉義符


[root@centos-7-24 tmp]# expr 2\>5
2>5
[root@centos-7-24 tmp]# expr 2 \> 5
0
[root@centos-7-24 tmp]# expr 6 \> 5
1
[root@centos-7-24 tmp]# expr 3 * 5
expr: 語法錯誤
[root@centos-7-24 tmp]# expr 3 \* 5
15
[root@centos-7-24 tmp]# expr 3 \+ 5
8

(2)對字符串的處理


[root@centos-7-24 tmp]# expr length "ni hao"
6
[root@centos-7-24 tmp]# expr substr "ni hao" 2 4 #從第2個開始,截取4個字符出來
i ha

20.3.2 使用$(())

格式:$((表達式1,表達2))

特點:

  1. 在雙括號結構中,所有表達式可以像c語言一樣,如:a++,b--等。a++ 等價於 a=a+1
  2. 在雙括號結構中,所有變量可以不加入:“$”符號前綴。
  3. 雙括號可以進行邏輯運算,四則運算
  4. 雙括號結構 擴展了for,while,if條件測試運算
  5. 支持多個表達式運算,各個表達式之間用“,”分開

常用的算數運算符

運算符 意義
++ -- 遞增及遞減,可前置也可以后置
+ - ! ~ 一元運算的正負號 邏輯與取反
+ - * / % 加減乘除與余數
< <= > >= 比較大小符號
== != 相等 不相等
>> << 向左位移 向右位移
& ^ ¦ 位的與 位的異或 位的或
&& ¦¦ 邏輯與 邏輯或
? : 條件判斷

例1:


[root@centos-7-24 tmp]# b=$((1+2))
[root@centos-7-24 tmp]# echo $b
3
[root@centos-7-24 tmp]# echo $((2*3))
6

例2:遞增和遞減


[root@centos-7-24 tmp]# echo $((b++))
3
[root@centos-7-24 tmp]# echo $b
4
[root@centos-7-24 tmp]# echo $((++b))
5
[root@centos-7-24 tmp]# echo $b
5

說明: a++或a--為先賦值再+1或減1 ; ++a或--a為先加1或減1,然后再進行賦值


END
2019/6/26 1:21:12


免責聲明!

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



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