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 預(yù)定義變量

預(yù)定義變量都有特殊的作用帖鸦,參看下表

變量名 功能
$? 表示當前進程中最后一條命令直接的返回狀態(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對應(yīng)的英文

[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)系作者
  • 序言:七十年代末悉罕,一起剝皮案震驚了整個濱河市赤屋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壁袄,老刑警劉巖类早,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嗜逻,居然都是意外死亡涩僻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門栈顷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逆日,“玉大人,你說我怎么就攤上這事妨蛹∑粮唬” “怎么了爽茴?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵翠忠,是天一觀的道長。 經(jīng)常有香客問我弃甥,道長颤难,這世上最難降的妖魔是什么神年? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮行嗤,結(jié)果婚禮上已日,老公的妹妹穿的比我還像新娘。我一直安慰自己栅屏,他們只是感情好飘千,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著栈雳,像睡著了一般护奈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哥纫,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天霉旗,我揣著相機與錄音,去河邊找鬼蛀骇。 笑死厌秒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的擅憔。 我是一名探鬼主播鸵闪,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暑诸!你這毒婦竟也來了岛马?” 一聲冷哼從身側(cè)響起棉姐,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啦逆,沒想到半個月后伞矩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡夏志,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年乃坤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沟蔑。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡湿诊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘦材,到底是詐尸還是另有隱情厅须,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布食棕,位于F島的核電站朗和,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏簿晓。R本人自食惡果不足惜眶拉,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憔儿。 院中可真熱鬧忆植,春花似錦、人聲如沸谒臼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜈缤。三九已至坞古,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劫樟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工织堂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叠艳,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓易阳,卻偏偏與公主長得像附较,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子潦俺,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

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