實(shí)用
grep -RiP ./ "something"在當(dāng)前的所有目錄中查找有something字眼的文件,可以配合less使用。
ls
ls [選項(xiàng)] [文件或目錄]
選項(xiàng):
- -a:顯示所有文件,包括隱藏文件
- -l:顯示所有詳細(xì)信息
- -d:查看目錄屬性,如
ls -ld /etc可以直接查看etc目錄的屬性 - -h:人性化顯示文件大小,一般與-l協(xié)同使用
- -i:顯示inode,每個(gè)文件都有一個(gè)節(jié)點(diǎn)號,就是inode.
通常使用ls -l比較多,但是ls -l有個(gè)別名:ll所以如果需要使用ls -l,只要敲ll就可以了。
通過ls - l可以獲取詳細(xì)信息,其中第一列表示文件權(quán)限,第二列表示當(dāng)前文件引用次數(shù),第三列表示文件的所有者,第四列表示文件的所屬組。
目錄處理命令
mkdir [-p] [目錄名]
- -p 遞歸創(chuàng)建
創(chuàng)建一個(gè)目錄不需要使用-p參數(shù),但是如果創(chuàng)建多級目錄,并且每級目錄都不存在,需要使用-p參數(shù)。如mkdir -p qxg/qqxg
rmdir [目錄名]
用于刪除空白目錄,如果目錄中有內(nèi)容,則無法刪除。通常刪除目錄使用的命令是rm
rm [選項(xiàng)] [目錄]
- r 刪除目錄
- f 強(qiáng)制刪除,不會進(jìn)行交互詢問是否刪除
比如 rm -rf /會刪除linux根目錄下的所有文件。rm -rf /tmp/是刪除/tmp這個(gè)目錄,而rm -rf /tmp/*是刪除/tmp目錄下的所有目錄。
通常不論刪除目錄還是文件,都會使用rm -rf這種習(xí)慣用法。
cp [選項(xiàng)] [原文件或目錄] [目標(biāo)目錄]
- -r 復(fù)制目錄
- -p 連帶文件屬性復(fù)制
- -d 若源文件是鏈接文件,則復(fù)制鏈接屬性
- -a 相當(dāng)于 -pdr。如果想要復(fù)制的文件或目錄和原來的一模一樣,只要加上-a命令就ok了。
該命令可以復(fù)制文件也可以復(fù)制目錄。
常見目錄
- / 根目錄
- /bin 存放必要的命令
- /boot 存放內(nèi)核以及啟動所需的文件等
- /dev 存放設(shè)備文件
- /etc 存放系統(tǒng)的配置文件
- /home 用戶文件的主目錄,用戶數(shù)據(jù)存放在其主目錄中
- /lib 存放必要的運(yùn)行庫
- /mnt 存放臨時(shí)的映射文件系統(tǒng),我們常把軟驅(qū)和光驅(qū)掛裝在這里的-
floppy和cdrom子目錄下。 - /proc 存放存儲進(jìn)程和系統(tǒng)信息
- /root 超級用戶的主目錄
- /sbin 存放系統(tǒng)管理程序
- /tmp 存放臨時(shí)文件的目錄
- /usr 包含了一般不需要修改的應(yīng)用程序,命令程序文件、程序庫、手冊和其它文檔。
- /var 包含系統(tǒng)產(chǎn)生的經(jīng)常變化的文件
鏈接命令
ln -s [源文件] [目標(biāo)文件]
- -s 創(chuàng)建軟連接
鏈接分為硬鏈接和軟鏈接。假設(shè)有一個(gè)文件/home/qxg/good,那么通過ln /home/qxg/good /tmp/bad創(chuàng)建該文件的硬鏈接,處于/tmp/下名為bad。那么在修改good文件的時(shí)候,bad文件也會跟著修改,但是刪除good的時(shí)候,bad依然存在,可以理解為硬鏈接就是java中的引用,其只是指向了文件的實(shí)際位置。
而軟鏈接就類似windows中的快捷方式,一般推薦使用軟鏈接的形式。
但是注意一點(diǎn),在創(chuàng)建鏈接的時(shí)候,源文件的路徑一定要寫絕對路徑。
文件搜索
locate
locate 文件名
locate的特點(diǎn)是搜索速度比較快,其在后臺數(shù)據(jù)庫中按文件名搜索,其中/var/lib/mlocate就是其所搜索的數(shù)據(jù)庫。但是如果創(chuàng)建一個(gè)新的文件的時(shí)候,不會被搜索到,因?yàn)閿?shù)據(jù)庫不是實(shí)時(shí)更新的。但是可以通過updatedb命令來強(qiáng)制進(jìn)行更新,然后再搜索就可以找到。
但是locate的弱點(diǎn)是只能搜索文件名。
locate搜索的規(guī)則是按照/etc/updatedb.conf配置文件進(jìn)行搜索
whereis和which
whereis 命令名
- b 只查找可執(zhí)行文件
- m 只查找?guī)椭募?/li>
搜索命令所在路徑以及幫助文檔所在位置。
如:whereis ls會打印出:
ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
類似這種樣式的命令還有很多,比如想要知道我是誰用whoami,想要知道命令是干什么用whatis.
which
同樣也是搜索命令的執(zhí)行文件,并且如果該命令有對應(yīng)的別名,也會被顯示出來。
如執(zhí)行which ls會打印:
alias ls='ls --color=auto'
/bin/ls
可以看到ls其實(shí)是執(zhí)行的ls --color=auto,表示不同的文件以不同的顏色列出。
find
find [搜索范圍] [搜索條件]
find搜索的內(nèi)容會和名字一模一樣,如果想要模糊搜索,可以使用通配符,通配符有以下幾種:
- * 匹配任意內(nèi)容
- ? 匹配任意一個(gè)字符
- [] 匹配任意一個(gè)括號以內(nèi)的字符
eg:
-
find / -name install.sh在根目錄搜索install.sh名字的文件。 -
find /root -iname install.sh不區(qū)分大小寫搜索 -
find /root -user root按照所有者搜索 -
find /root -nouser查找沒有所有者的文件 -
find /var/log/ -mtime +10查找10天前修改的文件,-10表示10天內(nèi),10表示10天當(dāng)天。-atime表示文件訪問,-ctime 表示修改文件屬性。 -
find . -size 25k按照文件大小搜索,+25k表示大于25k的文件,-25k表示小于25k的文件。k表示千字節(jié),M表示兆字節(jié),注意k不能是大寫,M不能是小寫。 -
find . -inum 252342查找inode節(jié)點(diǎn)為252342的文件
復(fù)雜eg: -
find /etc -size +20k -a -size -50k其中-a 表示and ,左右兩個(gè)條件都要滿足,所以該命令表示查找大于20k小于50k的文件。當(dāng)然也有-o 表示or。 -
find /etc -size +20k -a -size -50k -exec ls -lh {} \;查找大于20k且小于50k的文件,并且通過ls -lh顯示出來。其中-exec 命令 {} \;表示對搜索結(jié)果執(zhí)行操作。
grep
grep [選項(xiàng)] 字符串 文件名
- -i 忽略大小寫
- -v 排除指定字符串
在某文件中匹配符合條件的字符串,如grep "some" test.sh在test.sh中查找some字符串。
find 和 grep的區(qū)別是,find是在系統(tǒng)中搜索文件,grep是在文件中包含的字符串。find是通配符匹配,grep是正則表達(dá)式匹配。
用戶和組
一個(gè)用戶可以有多個(gè)用戶組,一個(gè)主組其他附組。
- /etc/group保存的是用戶的組信息,其格式為
組名稱:組密碼占位符:組編號:組中用戶名列表其中1~499編號是用戶裝的軟件所使用 - /etc/gshaow存儲當(dāng)前系統(tǒng)中用戶組的密碼信息,其格式為:
組名稱:組密碼:組管理者:組中用戶名列表 - /etc/passwd 存儲當(dāng)前系統(tǒng)中所有用戶的信息,其格式為:
用戶名:密碼占位符:用戶編號:用戶組編號:用戶注釋信息:用戶主目錄:shell類型 - /etc/shadow 存儲用戶密碼
用戶組 -
groupadd添加組 -
groupmod -n [修改后的組名] [修改前的組名]修改組名 -
groupmod -g [修改后的pid] 要修改的組名修改組編號 -
groupadd -g 888 boss創(chuàng)建888編號的用戶組boss -
groupdel刪除用戶組,刪除前,先刪除用戶組中的用戶
用戶 -
useradd -g [用戶組] [用戶]將某一用戶添加到用戶組里 -
useradd -d /home/qxg qxg創(chuàng)建qxg的時(shí)候指定主目錄,默認(rèn)和名字一樣 - 如果創(chuàng)建用戶沒有指定用戶組的時(shí)候,會默認(rèn)創(chuàng)建和用戶同名的用戶組
-
useradd -c [注釋] [用戶]給用戶添加注釋 -
usermod -l [新用戶名] [老用戶名]更改用戶名 -
usermod -g [目標(biāo)group] [user]將用戶修改到目標(biāo)用戶組 -
userdel [user]刪除用戶,不刪除目錄userdel -r [user]刪除用戶并刪除主目錄
其他 -
touch /etc/nologin禁止除root用戶 登錄到系統(tǒng)中 -
passwd -l [user]鎖定某個(gè)用戶 -
passwd -u [user]解鎖某個(gè)用戶 -
passwd -d [user]用戶無密碼登錄 -
passwd [user]修改用戶密碼
權(quán)限
使用ls -l列出來的文件信息,第一列的內(nèi)容就是權(quán)限內(nèi)容:-rw-r--r--.
其中第一位表示文件類型(- 文件,d 目錄, l 軟鏈接文件),后邊三位一組,每組分別表示文件所有者的權(quán)限,所屬組的權(quán)限,非所屬組的權(quán)限。完整的一組權(quán)限為rwx,r表示讀,w表示寫,x表示執(zhí)行。
shell
echo命令
echo [選項(xiàng)] [輸出內(nèi)容]
- -e 支持反斜杠控制的字符轉(zhuǎn)換
如 \a表示警告音,\b表示退格鍵,\r表示換行等等
還可以通過-e將輸出的內(nèi)容顯示出某種顏色。
第一個(gè)腳本
在shell中#號表示注釋,但是第一行的#!/bin/bash不能省略,表示linux的標(biāo)準(zhǔn)腳本。
比如創(chuàng)建一個(gè)腳本hello.sh:
#!/bin/bash
echo "lalala"
那么運(yùn)行腳本的方式有兩種:
- chmod 755 hello.sh 賦予運(yùn)行權(quán)限,然后./hello.sh直接運(yùn)行
- sh hello.sh運(yùn)行 或者bash hello.sh
bash基本功能
命令別名
- alias 查看系統(tǒng)中所有命令的別名
- alias 別名 = '原命令' 來創(chuàng)建別名。
- 將別名寫入到~/.bashrc 中,則永久生效
- unalias 別名 用來刪除別名
常用快捷鍵
- ctrl + c 強(qiáng)制終止當(dāng)前命令
- ctrl + l 清屏
- ctrl + a 光標(biāo)移動到命令行首
- ctrl + e 光標(biāo)移動到命令行尾
- ctrl + u 從光標(biāo)所在位置刪除到行首
- ctrl + z 把命令放入后臺
- ctrl + r 在歷史命令中搜索
- ctrl + d 表示退出(exit)
-
shift + PageUp顯示上一個(gè)屏幕內(nèi)容,使用clear后,可以使用這個(gè)命令查看
歷史命令
history [選項(xiàng)] [歷史命令保存文件]
- -c 清空歷史命令
- -w 把緩存中的歷史命令寫入歷史命令保存文件
- !n 表示重復(fù)執(zhí)行第n條歷史命令
- !! 重復(fù)執(zhí)行上一條命令
- !字符串 重復(fù)執(zhí)行最后一次以這個(gè)字符串開頭的命令
重定向
輸出重定向
- > 覆蓋
- >> 追加
- 2>標(biāo)準(zhǔn)錯(cuò)誤輸出
- 2>> 標(biāo)準(zhǔn)錯(cuò)誤輸出 追加方式,左右沒空格
- 命令 &> 文件,覆蓋方式把正確和錯(cuò)誤信息都重定向
- 命令 &>>文件 不解釋
- 命令>>文件1 2>>文件2
輸入重定向
- wc < log.log
多命令
- cmd1;cmd2 命令之劍沒有邏輯關(guān)系,但是cmd1執(zhí)行完后cmd2執(zhí)行
- cmd1&&cmd2 命令1執(zhí)行完后,命令2才執(zhí)行,命令1執(zhí)行不正確命令2不執(zhí)行。
- cmd1 || cmd2 命令1未正確執(zhí)行則命令2才執(zhí)行,命令1執(zhí)行正確,則命令2不執(zhí)行。
ls &> /dev/null 命令操作后,顯示的內(nèi)容直接丟到垃圾桶里。
歷史命令默認(rèn)保存1000條,如果覺得不夠,可以到/etc/profile中修改HISTSIZE
歷史命令保存在~/.bash_history下
變量規(guī)則
- 單引號中的專業(yè)字符均無用,雙引號中$有特殊含義
- 賦值方式是aa=123
- 而如果想要將命令結(jié)果賦給aa,可以使用() ,如 aa =(ls),將ls的結(jié)果賦給aa。
- 變量賦值的時(shí)候左右不能加空格。
- 調(diào)用變量需要在前邊加上
$如有個(gè)變量x=5,調(diào)用x變量需要使用$x - 所有的變量都是字符串類型,比如
x=5,那么$x是字符串,不能對其做加減等運(yùn)算。 - 如果想要做加減運(yùn)算,需要使用
$(()),如$(( 10 + 20 )) -
x="$x"456/x=$(x)456都是變量疊加,將原來的x加上后綴456 -
set命令會查詢到當(dāng)前系統(tǒng)中所以的變量。set -u執(zhí)行后,那么echo $a當(dāng)a變量不存在就會顯$示錯(cuò)誤信息,而默認(rèn)情況是顯示空字符。 -
unset刪除變量,unset x不需要加上$,同樣也可以刪除環(huán)境變量 -
export 變量名=變量值,定義環(huán)境變量方式 eg:export x=5。 -
env查看環(huán)境變量 - 建議將環(huán)境變量寫成大寫
- PS1變量:用于定義命令行前邊那一串的格式,如
ubuntu@localhost:/home/ubuntu #,具體怎么改,百度一下 -
locale用于顯示當(dāng)前語系變量,重要的是LANG和LC_ALL,LANG是定義系統(tǒng)主語系的變量,LC_ALL定義整體語系變量。 -
locale -a會顯示當(dāng)前支持的所有語言環(huán)境。
位置參數(shù)變量
| 位置參數(shù)變量 | 作用 |
|---|---|
$n |
n為數(shù)字,0表示命令本身,1~9表示參數(shù)從第一個(gè)到第九個(gè),10個(gè)以上需要使用大括號`{10}` |
$* |
表示命令行中所有參數(shù) |
$@ |
命令行中所有參數(shù),不過區(qū)分對待,比如使用for n in $@的時(shí)候就會起作用 |
$# |
參數(shù)個(gè)數(shù) |
預(yù)定義變量
| 預(yù)定義變量 | 作用 |
|---|---|
$? |
如果值為0,表示上一個(gè)命令執(zhí)行成功,其實(shí)多命令執(zhí)行就是根據(jù)這個(gè)來的 |
$$ |
當(dāng)前進(jìn)程的進(jìn)程號pid |
$! |
后臺運(yùn)行的最后一個(gè)進(jìn)程的pid |
輸入
read命令用于讀取間盤輸入,并且賦給某個(gè)變量
-
read -p "請輸入名字" name,-p表示輸出提示信息 -
read -p "請輸入名字" -t 30 name,-t表示30s后將會直接停止。 -
read -p "請輸入密碼" -s passwd,-s表示鍵盤輸入的內(nèi)容,命令行上不顯示 -
read -p "輸入[y/n]" -t 1 input-t表示只接受對應(yīng)個(gè)數(shù)的字符,接受完直接運(yùn)行。
shell運(yùn)算符
declare命令
聲明變量類型,如果不聲明變量類型,則默認(rèn)是字符串類型。
declare [+/-] [選項(xiàng)] 變量名
- - :給變量設(shè)定類型屬性
- + :取消變量類型屬性
- -a:數(shù)組
- -i:整數(shù)
- -x:環(huán)境變量
- -r:只讀變量
- -p:顯示變量被聲明的類型
數(shù)值運(yùn)算方法
declare -i cc=$aa+$bb-
cc=$(expr $aa + $bb)+號左右必須有空格 cc=$(($aa+$bb))cc=$[$aa+$bb]
環(huán)境變量配置文件
系統(tǒng)主要生效的環(huán)境變量有:
- /etc/profile
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
正常登錄:

非正常登錄:
/etc/bashrc -> /etc/profile.d/*.sh
其他配置文件
- ~/.bash_logout 登出的時(shí)候環(huán)境變量會生效
- ~/.bash_history 歷史命令的保存位置
- /etc/issue 登錄前顯示的信息
- /etc/issue.net 遠(yuǎn)程登錄前顯示信息
- /etc/motd 登錄成功后顯示的信息,
正則
awk,grep,sed是支持正則的,而find,cp,ls等只能使用通配符。
Linux中的基礎(chǔ)正則:
| 字符 | 作用 |
|---|---|
| * | 0次或多次 |
| . | 除換行符的任意字符 |
| ^ | 行首 |
| $ | 行尾 |
| [] | 括號內(nèi)任意字符 |
| [^] | 非括號內(nèi)任意字符 |
| 轉(zhuǎn)義,注意shell中的{}是特殊符號,用在正則中需要轉(zhuǎn)義 | |
| {n} | 出現(xiàn)n次 |
| {n,} | 不小于n次 |
| {n,m} | n~m次 |
cut命令
cut命令用來進(jìn)行列提取,grep是行提取
cut [OPTIONS] 文件名
- f 提取第幾列
- d 分隔符,默認(rèn)使用制表符
但是這個(gè)命令的智商比較低,只能截取規(guī)律的文件,如果目標(biāo)文件的內(nèi)容是多個(gè)空格隔開的,那么cut就不能起作用了。這個(gè)時(shí)候就要使用awk命令。
eg:cut -f 2,4 student.txt
awk
awk中的輸出命令只認(rèn)識print或printf,沒有echo命令。
awk '條件1{動作1} 條件2{動作2}...' 文件名
- 條件一般使用關(guān)系表達(dá)式作為條件
- 動作一般是格式化輸出如print,或流程控制等。
比如有以下文件:
Name Age Location
Mike 10 henan
Tok 20 hunan
使用awk如何輸出第1列和第3列,因?yàn)榉指舴强崭?,cut是沒法完成這個(gè)任務(wù),那么使用awk呢?
答案如下:awk '{printf $1 "\t" $3 "\n"}' student.txt或者awk '{print $1 "\t" $3}' student.txt.
awk是按行執(zhí)行命令,因?yàn)檫@個(gè)命令沒有條件,所以每行都要執(zhí)行,但是注意,其讀取完行,才開始執(zhí)行動作。而$1表示輸入的第一個(gè)參數(shù),所以可以按每行的輸入執(zhí)行對應(yīng)的輸出。
再說個(gè)問題:執(zhí)行df -h 后,找到磁盤使用量大于的20%的,如果有就報(bào)警,這個(gè)怎么做呢?
df -h|grep "/dev/sda5" | awk '{print $5}'|cut -d "%" -f 1
BEGIN,END
awk 'BEGIN{printf "This is a transcript\n"} {printf $2 "\t" $4 "\n"}' student.txt
BEGIN是一個(gè)表達(dá)式,表示在最開始的時(shí)候執(zhí)行后邊的動作。
而END是在最后的時(shí)候執(zhí)行后邊的動作。
那么這個(gè)東東又有什么用呢?
比如/etc/passwd中的文件,我想截取其中第一列的內(nèi)容,使用cut輕松完成cat /etc/passwd| cut -d ":" -f 1,那么使用awk的話,就需要借助于BEGIN:
ccat /etc/passwd | awk 'BEGIN{FS=":"} {printf $1"\n"}',FS=":"中的FS是內(nèi)置的一個(gè)變量,表示的是分隔符,在剛開始的時(shí)候就指定分隔符,這樣就可以輸出對應(yīng)的變量了。
而如果不加BEGIN:cat /etc/passwd | awk '{FS=":"} {printf $1"\n"}',那么執(zhí)行結(jié)果將是這樣的:
root:x:0:0:root:/root:/bin/bash
user1
user2
原因就是,讀取第一行后,先賦變量,然后才開始執(zhí)行動作,而這條命令是每行都會執(zhí)行,但是第一行執(zhí)行前,分隔符依然是:所以就導(dǎo)致了以上的結(jié)果出現(xiàn),解決辦法就是加上BEGIN
再看一個(gè)例子:
cat student.txt|grep -v Name | awk '$4>70{printf $2 "\n"}',表示大于70分的打印出名字。
注意grep -v Name表示取反,有Name的那一行不要.
sed
對數(shù)據(jù)進(jìn)行選取,替換,刪除 ,新增的命令
sed [OPTIONS] '[動作]' 文件名
- -n:一般sed會把所有數(shù)據(jù)輸出到屏幕,而使用-n后,只會把經(jīng)過sed命令處理的行輸出到屏幕
- -e: 允許輸入多條動作
- -i: 一般sed不會修改文件,只會將結(jié)果顯示在屏幕,但是加上-i會修改文件。
動作:
a:追加,在某一行的后邊添加一行或多行
c:行替換,用c后面的字符串替換原數(shù)據(jù)行
i:插入,在某一行的前邊插入一行或多行。
d:刪除,刪除指定行
p:輸出指定行
s:字符替換,用一個(gè)字符串替換另外一個(gè)字符串,與vim中的替換類似
行范圍s/新字符串/舊字符串/gsed -n '2p' student.txt:查看當(dāng)前文件的第二行,注意一定加上-n,如果沒有-n將輸出所有行。sed '2,4d' student.txt刪除第二行到第四行的數(shù)據(jù)sed '2a something' student.txt:在第二行的后邊加入一行內(nèi)容sed '2i something' student.txt:在第二行的前邊加入一行內(nèi)容sed '4c something' student.txt:將第4行替換為somethingsed '4s/70/100/g' student.txt將第四行的70替換為100,如果不加行數(shù),則會替換全文內(nèi)容。sed -e 's/furong//g;s/fengjie//g' student.txt-e指定多條命令,命令之間使用;隔開。
sort
sort [選項(xiàng)] 文件名
- -f : 忽略大小寫
- -n:以數(shù)值形進(jìn)行排序,默認(rèn)使用字符串
- -r:反向排序
- -t:指定分隔符,默認(rèn)是制表符
- -k n[,m] 按照指定的字段范圍排序,一般與-t結(jié)合使用,-t將每行分為多個(gè)字段,然后通過-k n,m來指定按照第某個(gè)字段排序。
wc
wc [選項(xiàng)] 文件名
- -l:只統(tǒng)計(jì)行數(shù)
- -w:只統(tǒng)計(jì)單詞數(shù)
- -m:只統(tǒng)計(jì)字符數(shù)
默認(rèn)會都統(tǒng)計(jì)。
shell流程控制
條件判斷
文件類型判斷
以下都是判斷文件是否存在,但是對應(yīng)的文件類型有不同,格式是[選項(xiàng)] 文件名
- -b 塊設(shè)備文件
- -c 字符設(shè)備文件
- -d 目錄文件
- -e 單純判斷文件是否存在
- -f 普通文件
- -L 符號鏈接文件
- p 管道文件
- -s 非空文件
- -S 套接字文件
用的最多的是 -d,-e,-f。
比如:
[ -e /root/install.log ]或test -e /root/install.log表示判斷/root/install.log是否存在
以上寫法都對,但是一般用第一種寫法,但是第一種寫法中括號兩邊要有空格。
[ -e /root/install.log] && echo yese || echo no文件存在會打印yes,不存在打印no??梢詫?code>cmd&&cmd||cmd理解為if esle語句。
根據(jù)文件權(quán)限判斷
以下都是判斷文件是否存在,同時(shí)判斷文件是否有對應(yīng)的權(quán)限
- -r 讀權(quán)限
- -w 寫權(quán)限
- -x 執(zhí)行權(quán)限
文件比較
- 文件1 -nt 文件2 :判斷文件1的修改時(shí)間是否比文件2的新,nt: new than
- 文件1 -ot 文件2 :old than
- 文件1 -ef 文件2:判斷文件1是否和文件2的Inode號一致。
兩個(gè)整數(shù)之間的比較
格式是num1 [選項(xiàng)] num2
- -eq :判斷兩個(gè)整數(shù)是否相等
- -ne:不相等
- -gt:大于
- -lt:小于
- -ge:大于等于
- -le:小于等于
字符串之間的比較
- -z 字符串 判斷字符串是否為空
- -n 判斷字符串是否非空
- 字符串 ==字符串2
- 字符串 != 字符串2
但是判斷的時(shí)候要加上雙引號,否則會出錯(cuò),比如[ -z $name ]
多重條件判斷
- 判斷1 -a 判斷2:邏輯與
- 判斷1 -o 判斷2:邏輯或
- !判斷:邏輯非
if
單分支if條件語句
if [ 條件判斷 ];then
程序
fi
或者
if [ 條件判斷 ]
then
程序
fi
雙分支if
if [ 條件判斷 ]
then
條件成立,執(zhí)行
else
條件不成立,執(zhí)行
fi
如,判斷讀取的字符串是不是一個(gè)目錄
#!/bin/bash
read -t 30 -p "input" dir
if [ -d $dir ]
then
echo "是目錄"
else
echo "不是"
fi
多分支if
if [ 條件1 ]
then
程序
elif [ 條件2 ]
then
程序
...
else
程序
fi
tips
- 在判斷字符相等時(shí)利用 == 判斷要注意兩邊都要有空格。
- if [ -n "num1" -a -n "num2" -a -n "$op" ]
shell編程類似的這種對于變量的判斷一定要記得加雙引號,雖然有時(shí)候顯得沒必要,但是在程序比較大時(shí)可能會因?yàn)檫@種小細(xì)節(jié)出錯(cuò),這種問題應(yīng)該調(diào)試半天也不一定能發(fā)現(xiàn).
case
case $變量名 in
"值1")
程序1
;;
"值2")
程序2
;;
*)
默認(rèn)程序
;;
esac
其中對于每個(gè)匹配的值,都可以使用正則來表示
for
for 變量 in 值1 值2 值3...
do
程序
done
如
for i in 1 2 3 4 5
do
echo $i
done
另一種格式:
for (( i=1;i<=100;i++))
do
程序
done
while
while [ 條件判斷 ]
do
程序
done
until
until和while剛相反,until是條件成立才終止
until [ 條件判斷 ]
do
程序
done