linux入門系列8--shell編程入門

本文將結(jié)合前面介紹的Linux命令、管道符等知識,通過VI編輯器編寫Shell腳本,實現(xiàn)能自動化工作的腳本文件。

在講解Linux常用命令“l(fā)inux入門系列5--新手必會的linux命令”一文中已提到,Shell終端解釋器是人機交互的橋梁,是用戶與內(nèi)核之間的翻譯官。它作為用戶與Linux系統(tǒng)內(nèi)部通信的媒介,為用戶提供了一個面向Linux內(nèi)核發(fā)送請求以便運行處橫向的界面系統(tǒng)級程序,用戶可以通過Shell啟動、掛起、停止程序。

一、Shell腳本及編程概述

1.1 Shell不僅是終端解釋器

實際上Shell不僅是一個命令行解釋器,除了能通過它控制程序的啟動、停止、掛起等操作外,它還是一個強大的編程語言,易編寫、易調(diào)試、靈活性強。Shell是解釋執(zhí)行的腳本語言,可以調(diào)用Linux系統(tǒng)命令。

Shell除了能夠支持各種變量和參數(shù)外,還提供了諸如循環(huán)、分支等高級編程語言才有的控制特性。要想正確使用這些特性,準確下達命令尤為重要,在講解具體編程語法之前,先學習一下Shell腳本的執(zhí)行方式。

1.2 Shell腳本工作方式

Shell腳本命令的工作方式有兩種:交互式和批處理。

  • 交互式:Interactive,用戶沒輸入一條命令就立即執(zhí)行。到目前為止前文采取的都是這種方式。
  • 批處理:Bach,事先編寫一個完整的Shell腳本,一次性執(zhí)行腳本中的諸多指令。接下來我們將采用的就是此種方式。

通過SHELL環(huán)境變量,可以查看當前系統(tǒng)默認使用的終端解釋器,默認采用Bash解釋器

[root@heimatengyun ~]# echo $SHELL
/bin/bash

1.3 第一個Shell腳本

在Shell腳本中不僅會用到前文學習過的Linux命令、管道符、數(shù)據(jù)流重定向等語法規(guī)則,還需要把內(nèi)部功能模塊化后通過邏輯語句進行處理,最終形成日常所見的shell腳本。

約定俗成的所有編程語言第一個程序都是Hello World,我們用Shell編寫一個簡單的腳本

[root@heimatengyun test]# ls
test1.txt  test2.txt
[root@heimatengyun test]# echo "hello world"
hello world
[root@heimatengyun test]# vi hello.sh
#!/bin/bash
#author:heimatengyun
echo " hello world"

保存并退出。Shell腳本文件可以是任意名稱,但是為了避免被誤認為是普通文件,建議后綴采用.sh,以表示是一個腳本文件。

ps:第一行#!/bin/bash是腳本聲明,用來告訴系統(tǒng)使用哪種Shell解釋器來執(zhí)行腳本。

第二行#author:heimatengyun是注釋信息,對腳本功能進行介紹方便日后維護。

第三行echo " hello world"是命令語句,可以是簡單的各種linux命令,也可以是通過各種邏輯語句和語法規(guī)則組合的復雜語句塊。

Shell編程格式就這么簡單,我稱之為Shell編程“三段式”,以后編碼就按照這個格式編寫即可。

1.4 執(zhí)行Shell腳本

Linux中執(zhí)行腳本有兩種方式:用解釋器直接執(zhí)行、通過腳本路徑執(zhí)行。

  • 用bash解釋器直接執(zhí)行

語法:bash或sh 腳本名稱

案例:執(zhí)行前文創(chuàng)建的hello.sh腳本文件

[root@heimatengyun test]# bash hello.sh 
 hello world
[root@heimatengyun test]# sh hello.sh 
 hello world
  • 通過腳本路徑執(zhí)行

語法:腳本的絕對路徑或相對路徑

案例:執(zhí)行前文創(chuàng)建的hello.sh腳本文件

[root@heimatengyun test]# /root/test/hello.sh
-bash: /root/test/hello.sh: Permission denied
[root@heimatengyun test]# ./hello.sh
-bash: ./hello.sh: Permission denied

納尼?提示權(quán)限不足。是的,你沒看錯,如果通過路徑這種方式運行,需要修改文件的執(zhí)行權(quán)限,(默認的權(quán)限不可以執(zhí)行,并且在數(shù)據(jù)腳本路徑時按tab鍵也無補全提示)文件權(quán)限相關(guān)命令將在后續(xù)文章中繼續(xù)講解,此處先按照如下命令添加腳本的可執(zhí)行權(quán)限即可。

[root@heimatengyun test]# ll
total 12
-rw-r--r--. 1 root root  4 Dec  1 09:48 hello.sh
[root@heimatengyun test]# chmod 777 hello.sh 
[root@heimatengyun test]# ll
total 8
-rwxrwxrwx. 1 root root 53 Dec  1 09:22 hello.sh

再次執(zhí)行,此時輸入路徑在按tab鍵也會提示自動補全了

[root@heimatengyun test]# ./hello.sh 
 hello world
[root@heimatengyun test]# /root/test/hello.sh 
 hello world

二、Shell編程語法

掌握Shell腳本運行方式后,我們正式開始進入Shell編程語法學習。

任何一門語言的學習都沒有速成方法,都離不開大量的練習,只有多敲才能更加熟練,才能理解的更加深刻。

2.1 變量

Linux Shell(此處為默認bash)中的變量分為系統(tǒng)變量和用戶自定義變量,系統(tǒng)變量包括HOME、PWD、SHELL、USER等,用戶自定義變量則為用戶根據(jù)實際需要自定義的變量。

可以通過set命令查看Shell中所有變量。

[root@heimatengyun test]# set
BASH=/bin/bash
...省略部分內(nèi)容

下文主要演示自定義變量

2.1.1 定義變量

語法:

? 變量名=值

變量命名規(guī)則:

? (1)變量名可以由字母、數(shù)字和下劃線注冊,但不能以數(shù)字開頭

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

? (3)變量名一般大寫

案例:

(1)定義變量并使用

[root@heimatengyun test]# SRT="wellcome"
[root@heimatengyun test]# echo $SRT
wellcome
[root@heimatengyun test]# set |grep SRT
SRT=wellcome
[root@heimatengyun test]# env |grep SRT
[root@heimatengyun test]# 

可以看到自定義變量SRT,可以通過set命令查詢出來。

(2)變量提升為全局環(huán)境變量

[root@heimatengyun test]# export SRT
[root@heimatengyun test]# env |grep SRT
SRT=wellcome

上例中自定義的變量SRT通過env命令查看,并未在環(huán)境變量中查詢出來,通過export將自定義變量SRT提升為環(huán)境變量后,就可以通過env查詢出來

(3)撤銷變量

[root@heimatengyun test]# unset SRT
[root@heimatengyun test]# echo $SRT

[root@heimatengyun test]# set |grep SRT
[root@heimatengyun test]# env |grep SRT

撤銷變量使用unset命令,撤銷之后變量將不存在

2.2 變量賦值

除了直接賦值,還可以將命令執(zhí)行的結(jié)果賦值給變量

語法:

? 變量=`命令`變量=$(命令)

說明:

? 命令用反引號或$()包含起來,先執(zhí)行命令然后將命令執(zhí)行結(jié)果賦值給變量。

案例:

[root@heimatengyun test]# ls
hello.sh  test1.txt  test2.txt
[root@heimatengyun test]# RESULT=`ls`
[root@heimatengyun test]# echo $RESULT
hello.sh test1.txt test2.txt
2.3 位置參數(shù)變量

位置參數(shù)變量主要用于取腳本的參數(shù)值,語法如下

變量名稱 功能
$n n為數(shù)字,0表示命令本身,1-9表示第一到第九個參數(shù),十以上的參數(shù)需要用大括號包含,如第十個參數(shù)為${10}
$* 表示命令行中所有的參數(shù),把參數(shù)看成一個整體
$@ 表示命令行中所有的參數(shù),把每個參數(shù)區(qū)分對待
$# 表示命令行中所有參數(shù)的個數(shù)

案例:

輸入2個參數(shù),計算倆個數(shù)的和并打印輸出

[root@heimatengyun test]# vi sum.sh
#sum
#!/bin/bash
#分別接收2個參數(shù)
num1=$1
num2=$2
#求和
sum=$(($num1+$num2))
#打印
echo $sum

保存并退出,執(zhí)行腳本輸入2個數(shù)查看執(zhí)行結(jié)果

[root@heimatengyun test]# bash sum.sh 1 2
3
2.4 預定義變量

預定義變量都有特殊的作用,參看下表

變量名 功能
$? 表示當前進程中最后一條命令直接的返回狀態(tài)。0:執(zhí)行成功;非0:執(zhí)行失敗
$$ 當前進程號(PID)
$! 后臺運行的最后一個進程的進程號(PID)

案例:

(1)查看當前進程和后臺運行的最后一個進程

[root@heimatengyun test]# vi mypid.sh 
#!/bin/bash
#輸出當前進程PID,也就是當前腳本運行時生成的PID
echo "當前進程PID=$$"
echo "最后一個后臺進程PID=$!"

保存退出,執(zhí)行腳本

[root@heimatengyun test]# bash mypid.sh 
當前進程PID=7810
最后一個后臺進程PID=

可以看到和 $!的區(qū)別,表示當前進程PID,而$!表示是后臺最有運行的一個進程的PID。

(2)輸出當前進程PID,并查看上一次命令執(zhí)行結(jié)果

[root@heimatengyun test]# vi pid.sh
#!/bin/bash
#輸出當前進程PID,也就是當前腳本運行時生成的PID
echo "當前進程PID=$$"
#通過ls命令,查找不存在的文件,&表示讓命令后臺執(zhí)行
ls -l XXX.txt&
echo "最后一個進程PID=$!"
echo "最后一條命令執(zhí)行結(jié)果:$?"

保存退出,執(zhí)行腳本

[root@heimatengyun test]# bash pid.sh 
當前進程PID=7395
最后一個進程PID=7396
最后一條命令執(zhí)行結(jié)果:0
[root@heimatengyun test]# ls: cannot access XXX.txt: No such file or directory

[root@heimatengyun test]# 

可以看到命令執(zhí)行的進程和當前腳本運行的進程不是同一個,并且雖然xxx.txt文件不存在,但結(jié)果仍然返回為0。如果改為查找一個已經(jīng)存在的文件,毋庸置疑,返回結(jié)果肯定仍然為0。也就是說上邊腳本不管命令執(zhí)行是否成功,都將返回0,原因是通過&讓命令后臺執(zhí)行,實際上是新開了一個進程,而$?只能獲取到當前進程的最后一次執(zhí)行命令結(jié)果,因此在做判斷命令是否執(zhí)行成功是特別要小心。

2.2 運算符和表達式

語法:

(1)((運算式)) 或[運算式]

(2)expr m + n 注意expr運算符間要有空格

案例:

(1)采用$(())實現(xiàn)兩數(shù)相加

[root@heimatengyun test]# S=$((2+3))
[root@heimatengyun test]# echo $S
5

(2)采用$[]實現(xiàn)兩數(shù)相加

[root@heimatengyun test]# SUM=$[2+3]
[root@heimatengyun test]# echo $SUM 
5

(3)采用expr命令實現(xiàn)兩數(shù)相加

[root@heimatengyun test]# S1=`expr 2 + 3` 
[root@heimatengyun test]# echo $S1
5

注意expr命令時,操作符之間一定要有空格,否則執(zhí)行的不是計算,而是字符串連接,如下示例演示了有空格和無空格的區(qū)別,另外乘法符號*由于與通配符沖突,因此需要用\轉(zhuǎn)義

[root@heimatengyun test]# expr 2 + 3
5
[root@heimatengyun test]# expr 2+3
2+3
[root@heimatengyun test]# expr 2\*3
2*3
[root@heimatengyun test]# expr 2 \* 3
6
[root@heimatengyun test]# expr 2 * 3 
expr: syntax error

(4)采用expr命令計算“2加3的和乘以5”

[root@heimatengyun test]# S2=`expr 2 + 3`
[root@heimatengyun test]# echo $S2
5
[root@heimatengyun test]# expr $S2 \* 5
25

注意操作符之間的空格,以上為分步計算,也可以直接一步計算,多層嵌套是注意需要轉(zhuǎn)義反引號,如下:

[root@heimatengyun test]# expr `expr 2 + 3` \* 5
25
[root@heimatengyun test]# echo `expr \`expr 2 + 3\` \* 5`
25

2.3 條件判斷語句

2.3.1 條件判斷基本使用

語法:[ 條件 ]

說明:條件前后必須要有空格,非空返回true,可以使用$?驗證(0:true,非0:false)

案例:

(1)分別判斷存在和不存在的變量,檢驗返回值

[root@heimatengyun test]# [ $HOME ]  
[root@heimatengyun test]# echo $?    
0
[root@heimatengyun test]# [ $TEST ]      
[root@heimatengyun test]# echo $?    
1

由于$HOME是環(huán)境變量肯定存在,因此返回0,表示條件滿足,變量不為空;而TEST變量由于沒定義,所以不存在,返回非0。

(2)條件判斷語句用于邏輯判斷

[root@heimatengyun test]# [ $HOME ]&& echo ok || echo notok
ok
[root@heimatengyun test]# [ $TEST ]&& echo ok || echo notok     
notok

類似于其他語言中的三元運算符,條件滿足則執(zhí)行緊隨其后的語句,否則不執(zhí)行。

2.3.2 常用判斷條件
  • 兩個整數(shù)之間比較
符號 含義
= 字符串比較
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
  • 按文件權(quán)限判斷
符號 含義
-r 有讀的權(quán)限
-w 有寫的權(quán)限
-x 有執(zhí)行的權(quán)限
  • 按文件類型判斷
符號 含義
-f 文件存在且是一個常規(guī)文件
-d 文件存在并且是一個目錄
-e 文件存在
  • 案例

(1)整數(shù)比較

[root@heimatengyun test]# [ 1 -gt 2 ]
[root@heimatengyun test]# echo $?    
1

1不大于2,所以輸出1,表示false

(2)文件類型判斷

[root@heimatengyun test]# [ -f test1.txt ]
[root@heimatengyun test]# echo $?
0
[root@heimatengyun test]# [ -f xxxx.txt ]     
[root@heimatengyun test]# echo $?        
1

test1.txt文件存在,輸出0表示true;而xxxx.txt文件不存在,所以輸出1表示false

(3)文件權(quán)限判斷

[root@heimatengyun test]# ll
-rw-r--r--. 1 root root   9 Nov 30 20:43 test1.txt
[root@heimatengyun test]# [ -x test1.txt ]
[root@heimatengyun test]# echo $?
1

由于test1.txt 無執(zhí)行權(quán)限,因此返回1,表示false

2.4 流程控制語句

流程控制結(jié)構(gòu)分為:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)根據(jù)語句依次順序執(zhí)行,分支結(jié)構(gòu)根據(jù)條件判斷運行不同的分支,循環(huán)結(jié)構(gòu)則根據(jù)條件判斷是否循環(huán)執(zhí)行。

2.4.1 分支語句

分支語句分為:if判斷語句、case語句

  • if判斷

語法:


if [ 判斷條件 ]

then

? 程序

fi


或者then寫到判斷條件之后,用逗號隔開,等效于上邊語句

if [ 判斷條件 ];then

? 程序

fi


if判斷還可以多層嵌套,形如:

if [ 判斷條件1 ]

then

? 程序1

elif [ 判斷條件2 ]

? then

? 程序2

else

? 程序3

fi


說明:條件判斷語句中,注意前中括號與if之間必須有空格,中括號前后也必須都有空格

案例:

從鍵盤輸入年齡,根據(jù)年齡返回不同的形容語言

[root@heimatengyun test]# vim if.sh
#!/bin/bash
read -p "請輸入您的年齡:" AGE
if [ $AGE -le 18 ];then
      echo "未成年"
  elif [ $AGE -le 30 ];then
      echo "年輕氣盛"
  else
      echo "糟老頭子"
fi

使用vim編輯器編輯內(nèi)容(此處使用vim是因為vim比vi更適合在編程環(huán)境使用,有錯誤提示等功能,建議編寫腳本都采用vim),保存退出并執(zhí)行腳本

[root@heimatengyun test]# bash if.sh 
請輸入您的年齡:16
未成年
[root@heimatengyun test]# bash if.sh 
請輸入您的年齡:40
糟老頭子

此處使用了read命令讀取鍵盤輸入,-p參數(shù)表示顯示提示符內(nèi)容。

  • case語句

語法:


case $變量 in

? " 值1")

? 語句1

? ;;

? " 值2")

? 語句2

? ;;

? *)

? 語句

? ;;

esac


案例:

根據(jù)傳入腳本的參數(shù)分別輸出1、2、3對應的英文

[root@heimatengyun test]#vim case.sh
#!/bin/bash
case $1 in
  1)
    echo one
    ;;
  2)
    echo two
    ;;
  3)
    echo three
    ;;
  *)
    echo "error"
    ;;
esac

保存退出并執(zhí)行

[root@heimatengyun test]# bash case.sh 1
one
[root@heimatengyun test]# bash case.sh 2
two
[root@heimatengyun test]# bash case.sh 3
three
[root@heimatengyun test]# bash case.sh 8
error
2.4.2 循環(huán)語句

循環(huán)語句分為:for循環(huán)、while循環(huán)

  • for循環(huán)語句

for循環(huán)有兩種語法格式,分別如下:

語法1:


for 變量 in 值1 值2 值3...

? do

? 程序

? done


語法2:


for ((初始值;循環(huán)控制條件;變量變化))

do

? 程序

? done


案例:

(1)一天三次問好

[root@heimatengyun test]#vim greeting.sh 
#!/bin/bash
for time in morning afternoon evening
  do
     echo "good $time"
  done

保存并退出,執(zhí)行問候腳本,輸出問候語句

[root@heimatengyun test]# bash greeting.sh 
good morning
good afternoon
good evening

(2)用for循環(huán)求1累加到5的和

[root@heimatengyun test]# vim getsum.sh
#!/bin/bash
sum=0
for ((i=0;i<=5;i++))
   do
     sum=$(($i+$sum))
   done
echo "sum=$sum"

保存退出,并執(zhí)行腳本

[root@heimatengyun test]# bash getsum.sh 
sum=15
  • while循環(huán)語句

語法:


while [ 條件判斷式 ]

? do

? 程序

? done


案例:

(1)用while循環(huán)求1累加到5的和

[root@heimatengyun test]# vim while.sh  
#!/bin/bash
i=1
sum=0
while [ $i -le 5 ]
    do
     sum=$[$i+$sum]
     i=$[$i+1]
    done
echo "sum=$sum" 

保存并執(zhí)行

[root@heimatengyun test]# bash while.sh 
sum=15

注意:

1、是給變量賦值,左邊不用加符號,比如i=[i+1]不能寫成i=[i+1],否則報錯“command not found”

2、條件判斷語句注意左中括號與關(guān)鍵字之間、括號內(nèi)部首位、操作符與操作數(shù)之間都有空格

3、i=[i+1],如果錯寫為i=$i+1則會報錯“integer expression expected”。

2.5 函數(shù)

函數(shù)是對功能的封裝,可以提供代碼重用性。函數(shù)分為系統(tǒng)函數(shù)和用戶自定義函數(shù),對于系統(tǒng)函數(shù)直接拿來使用即可,自定義函數(shù)則是根據(jù)具體需求編寫。

2.5.1 系統(tǒng)函數(shù)

使用現(xiàn)有的系統(tǒng)函數(shù)可以提高工作效率,由于篇幅所限,只簡單介紹兩個與文件路徑相關(guān)的系統(tǒng)函數(shù),具體使用方法也可以通過前面介紹的man命令來查詢函數(shù)具體的用法。

  • basename

語法:

? basename [文件路徑或字符串] [后綴]

功能描述:

? 刪掉所有的前綴,包括最后一個/,然后打印字符串;指定了后綴則在此基礎(chǔ)上再去掉后綴。

案例:

[root@heimatengyun test]# basename "sdf/sdf/sdf"
sdf
[root@heimatengyun test]# basename /root/test/test1.txt 
test1.txt
[root@heimatengyun test]# basename /root/test/test1.txt txt
test1.
[root@heimatengyun test]# basename /root/test/test1.txt .txt
test1
  • dirname

語法:

? dirname 文件絕對路徑

功能描述:

? 從給定的包含絕對路徑的文件名中去除文件名,然后返回生效的路徑。簡單說就是去掉非目錄部分,返回保留目錄部分,但不包含最后的/

案例:

[root@heimatengyun test]# dirname /root/test/test1.txt    
/root/test
2.5.2 自定義函數(shù)

語法:


[function] 函數(shù)名[()]

{

? 語句;

? [return 返回值;]

}


說明:

(1)shell是解釋執(zhí)行而非編譯執(zhí)行,因此語句是逐行執(zhí)行的,必須在函數(shù)調(diào)用之前先聲明函數(shù)。

(2)函數(shù)返回值只能通過$?系統(tǒng)變量獲取。可以顯示添加return語句返回(返回值范圍為0-255),否則將以最后一條命令運行結(jié)果作為返回值返回。

方括號內(nèi)的部分function、參數(shù)、返回值可以是可選的。function show() 和function show和show()這幾種形式都是可以的。

案例:

(2)輸入1個整數(shù),打印出比輸入小的整數(shù)

[root@heimatengyun test]# vim function.sh  
#!/bin/bash
function printNumber()
{
  i=0;
  while [ $i -lt $1 ]
  do
     echo $i;
     i=$[$i+1];
#    i=`expr \`expr $i + 1 \``     
     sleep 1;
  done
  return 0;
}
read -p "請輸入一個數(shù):" n;
printNumber $n;

保存文件并執(zhí)行腳本

[root@heimatengyun test]# bash function.sh 
請輸入一個數(shù):5
0
1
2
3
4

三、編寫Shell腳本

通過上邊的演示,基本已經(jīng)會編寫簡單的shell腳本了,本小節(jié)講解shell腳本接收用戶參數(shù)以及用戶參數(shù)的判斷。

3.1 接收用戶參數(shù)

之前提到過對linux命令來說,能否根據(jù)需要采用各種參數(shù)組合來完成特定的功能才是衡量命令是否掌握的標準。同樣,函數(shù)或腳本也需要與用戶交互,能靈活處理用戶參數(shù)。

前面2.3中中已經(jīng)提到幾個shell內(nèi)設(shè)的用于接收參數(shù)的變量:1...,*,@,#

下面用案例進行演示

[root@heimatengyun test]# vim para.sh
#!/bin/bash
echo "當前腳本名稱:$0"
echo "總共有$#個參數(shù),分別為:$*"
echo "第一個參數(shù)為:$1,第三個參數(shù)為:$3"

保存腳本,并執(zhí)行

[root@heimatengyun test]# bash para.sh 1 2 3
當前腳本名稱:para.sh
總共有3個參數(shù),分別為:1 2 3
第一個參數(shù)為:1,第三個參數(shù)為:3

可以看到,腳本名稱后直接帶參數(shù),參數(shù)之間用空格隔開,在腳本內(nèi)部直接可以獲取到各個位置上的參數(shù)

3.2 判斷用戶參數(shù)

shell腳本中條件判斷語句可以用來判斷表達式是否成立,若條件成立返回0表示true,否則返回其他非0隨機數(shù)表示false。按判斷對象的不同,可以分為以下四種判斷語句:文件測試語句、邏輯測試語句、整數(shù)值比較語句、字符串比較語句。

3.2.1 文件測試語句

文件測試即是用指定的條件判斷文件是否存在或權(quán)限是否滿足,文件測試具體參數(shù)如下

運算符 作用
-d 測試文件是否為目錄類型
-e 測試文件是否存在
-f 判斷是否為一般文件
-r 測試當前用戶是否有讀權(quán)限
-w 測試當前用戶是否有寫權(quán)限
-x 測試當前用戶是否有執(zhí)行權(quán)限

案例:

判斷是否為目錄類型的文件

[root@heimatengyun test]# [ -d /root/test ]
[root@heimatengyun test]# echo $?
0
[root@heimatengyun test]# [ -d /root/test/test1.txt ]
[root@heimatengyun test]# echo $?
1

先通過條件測試語句進行判斷,再使用shell解釋器內(nèi)置的$?變量查看執(zhí)行結(jié)果。由于/root/test為目錄,所以返回0;test1.txt是文件,所以返回1.

3.2.2 邏輯測試語句

邏輯語句用于對測試結(jié)果進行邏輯分析,根據(jù)測試結(jié)果可實現(xiàn)不同的效果。邏輯運算符如下:

運算符 作用
&& 邏輯與,表示當前面的命令執(zhí)行成功后才會執(zhí)行后邊的命令
|| 邏輯或,表示當前面的命令執(zhí)行失敗后才會執(zhí)行后邊的命令
! 邏輯非,表示把條件測試中判斷結(jié)果取反。

案例:

判斷當前登錄用戶是否為管理員

[root@heimatengyun test]# [ ! $USER = root ] && echo "user" || echo "root"
root
3.2.3 整數(shù)值比較語句

整數(shù)比較運算符僅是對數(shù)字的操作,不能將數(shù)字與字符串、文件等內(nèi)容一起操作,而且不能想當然地使用日常生活中的等號、大于號、小于號等來進行判斷。

ps:等號與賦值命令符沖突,大于小于號分別與輸出輸入重定向命令符沖突。因此一定要按照規(guī)范的整數(shù)比較運算符來進行操作。

可用的整數(shù)比較運算符如下表:

運算符 作用
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否小于或等于
-ge 是否大于或等于

案例:

[root@heimatengyun test]# [ 1 -lt 2 ]
[root@heimatengyun test]# echo $?    
0
[root@heimatengyun test]# [ 1 -gt 2 ]  
[root@heimatengyun test]# echo $?    
1
3.3.4 字符串比較語句

字符串比較語句用于判斷測試字符串是否為空或兩個字符串是否相等。常用來判斷某個變量是否未被定義,即內(nèi)容為空值。字符串常見運算符如下表:

運算符 作用
= 比較字符串內(nèi)容是否相同,相同為0
!= 比較字符串內(nèi)容是否不同,不同為0
-z 判斷字符串內(nèi)容是否為空,空則為0

案例:

分別查看存在和不存在的變量,區(qū)別返回值

[root@heimatengyun test]# echo $USER
root
[root@heimatengyun test]# echo $TEST

[root@heimatengyun test]# [ -z $USER ]
[root@heimatengyun test]# echo $?
1
[root@heimatengyun test]# [ -z $TEST ]
[root@heimatengyun test]# echo $?     
0

至此,shell編程相關(guān)知識就介紹完畢,下一篇文章繼續(xù)學習與用戶和文件、權(quán)限相關(guān)的知識。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,725評論 0 5
  • 第 2 章 SHELL 基礎(chǔ)知識2.1 shell腳本我們在上面簡單介紹了一下什么是shell腳本,現(xiàn)在我們來進一...
    LiWei_9e4b閱讀 1,650評論 0 0
  • 本文是對Linux shell編程的一個學習比較,共包括如下章節(jié)的內(nèi)容: 概述 基本語法 結(jié)構(gòu)化語句 函數(shù) 小結(jié) ...
    我是老薛閱讀 903評論 0 5
  • Shell入門 什么是shell? Shell其實是一個命令解釋器,作用是解釋執(zhí)行用戶輸入的命令以及程序等,用戶每...
    酷酷的偉閱讀 497評論 0 1
  • 特別說明:以下內(nèi)容來自簡書,鏈接為原文出處,一切權(quán)益歸原作者所有,在此感謝原作者的分享,大家可以點擊以下鏈接查看原...
    沈祥佑閱讀 634評論 0 4

友情鏈接更多精彩內(nèi)容