1. 程式人生 > >egrep、bash環境配置及腳本、vim編輯器

egrep、bash環境配置及腳本、vim編輯器

系統 Linux

egrep及擴展的正則表達式

egrep = grep -E

egrep [options] pattern [file..]

擴展正則表達式的元字符
字符匹配
.:匹配任意單個字符
[root@localhost ~]# grep -E . /tmp/123
ABC
123
boy

[]:匹配指定範圍內的單個字符
[root@localhost ~]# grep -E [abc] /tmp/123
boy
abc

[^]:匹配指定範圍外的單個字符
[root@localhost ~]# grep -E [^abc] /tmp/123
ABC
123
boy

次數匹配:
:匹配前面的字符任意次
[root@localhost ~]# grep -E "a

b" /tmp/mytest
b
ab
aab
aaab

?:匹配前面的字符0次或1次
[root@localhost ~]# grep -E "a?b" /tmp/mytest
b
ab
aab
aaab

+:匹配前面的字符1次或多次
[root@localhost ~]# grep -E "a+b" /tmp/mytest
ab
aab
aaab

{m}:匹配前面的字符m次
[root@localhost ~]# grep -E "a{2}b" /tmp/mytest
aab
aaab

{m,n}:匹配前面的字符至少m次,至多n次
[root@localhost ~]# grep -E "a{2,3}b" /tmp/mytest

aab
aaab

錨定
^:錨定行首
[root@localhost ~]# grep -E "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash

$:錨定行尾
[root@localhost ~]# grep -E "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
rocket:x:507:507::/home/rocket:/bin/bash
allen:x:701:701::/home/allen6:/bin/bash

\<或\b:錨定詞首
[root@localhost ~]# grep -E "\<root" /etc/passwd

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

\>或\b:錨定詞尾
[root@localhost ~]# grep -E "root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

分組
():括號中的字符串作為分組,並後向引用,\1,\2,...

或者
a|b:C|cat 表示C或cat

練習:
1、顯示當前系統root、centos、user1用戶的默認shell和UID
[root@localhost ~]# grep -E "^(root|centos|user1)\>" /etc/passwd | cut -d: -f3,7
0:/bin/bash
707:/bin/bash
708:/bin/bash

2、找出/etc/rc.d/init.d/functions文件(centos)中某單詞後面跟一個小括號的行
[root@localhost ~]# grep -E -o "[_[:alpha:]]+()" /etc/rc.d/init.d/functions

3、使用echo輸出一絕對路徑,使用egrep取出器路徑基名;並且使用egrep取出路徑的目錄名,類似於dirname命令的結果
[root@localhost ~]# echo "/etc/passwd" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
[root@localhost ~]# echo "/etc/passwd/" | grep -E -o "[^/]+/?$" | cut -d"/" -f1

4、找出ifconfig命令結果中1-255之間的數值
ifconfig | grep -E --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

5、找出ifconfig命令結果中的IP地址

fgrep "" 不支持正則表達式搜索
[root@localhost ~]# fgrep --color=auto "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

bash的基礎特性(4)

變量類型:數據存儲格式、存儲空間大小、參與運算種類

字符型
數值型(整型、浮點型)

強類型:定義變量是必須指定類型,參與運算必須符合類型要求,調用未聲明變量會產生錯誤;例如:C
弱類型:無須指定類型,默認均為字符型,參與運算會自動進行隱式類型轉換;例如:bash

bash中的變量的種類:
根據變量的生效範圍的標準劃分:
本地變量:生效範圍為當前shell進程,對當前shell之外的其他shell進程,包括當前shell的子shell進程均無效
環境變量:生效範圍為當前shell進程及其子進程
局部變量:生效範圍為當前shell進程中某代碼片段(通常指函數)
位置變量:$1、$2...來表示,用於讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
特殊變量:$?、$0

本地變量:
變量賦值:name=‘value’
可以使用引用
value:
(1)可以是直接字串 name=‘username’
[root@localhost ~]# name=tom
[root@localhost ~]# echo $name
tom

(2)變量引用 name=‘$username’
[root@localhost ~]# name1="allen $name"
[root@localhost ~]# echo $name1
allen tom

(3)命令引用 name=command name=$(command)
[root@localhost ~]# name2=head -1 /etc/passwd | cut -d: -f1
[root@localhost ~]# echo $name2
root

[root@localhost ~]# name=$(tail -1 /etc/passwd | cut -d: -f1)
[root@localhost ~]# echo $name
centos

變量引用:${name},$name
[root@localhost ~]# echo $name
centos
[root@localhost ~]# echo ${name}
centos

"" 弱引用,其中的變量引用會被替換為變量值;
[root@localhost ~]# echo "$SHELL"
/bin/bash
‘’ 強引用,其中的變量引用不會被替換為變量值,而保持原字符串
[root@localhost ~]# echo ‘$SHELL‘
$SHELL

顯示已定義的所有變量:set
銷毀變量:unset name
[root@localhost ~]# name=tom
[root@localhost ~]# echo $name
tom
[root@localhost ~]# unset name
[root@localhost ~]# echo $name

環境變量
變量聲明,賦值
export name=value
declare -x name=value
[root@localhost ~]# export name=allen
[root@localhost ~]# echo $name
allen

[root@localhost ~]# declare -x name=ben
[root@localhost ~]# echo $name
ben

變量引用:$name、${name}
[root@localhost ~]# echo $name
ben
[root@localhost ~]# echo ${name}
ben

顯示所有變量
export
env
printenv

銷毀變量:unset name
[root@localhost ~]# unset name
[root@localhost ~]# echo $name

bash有許多內建的環境變量:PATH SHELL UID HISTSIZE HOME PWD HISTFILE PS1

變量命名法則:
1、不能使用程序中的保留字,例如:if、for等
2、只能使用數字,字母及下劃線,且不能以數字開頭;
3、見名知義

只讀變量:
readonly name
declare -r name
[root@localhost ~]# name=kidd
[root@localhost ~]# readonly name
[root@localhost ~]# name=hill
-bash: name: readonly variable

[root@localhost ~]# name=curry
[root@localhost ~]# declare -r name
[root@localhost ~]# name=hill
-bash: name: readonly variable

位置變量:
在腳本代碼中調用命令行傳遞給腳本的參數
$1、$2、... 對應調用第1、第2等參數
[root@localhost tmp]# cat a.sh
#!/bin/bash

echo $1 $2

[root@localhost tmp]# . a.sh tom mary
tom mary
[root@localhost tmp]# . a.sh 10 20
10 20

shift [n] 剔除位置變量 位置變量替崗
[root@localhost tmp]# cat a.sh
#!/bin/bash

echo $1
shift 1
echo $1
shift 1
echo $1

[root@localhost tmp]# . a.sh tom mary kidd
tom
mary
kidd
[root@localhost tmp]# . a.sh 10 20 30
10
20
30
$0 命令本身
[root@localhost tmp]# cat a.sh
#!/bin/bash

echo $0

[root@localhost tmp]# bash /tmp/a.sh
/tmp/a.sh

$* 傳遞給腳本的所有參數
$@ 傳遞給腳本的所有參數
$# 傳遞給腳本的參數的個數
[root@localhost tmp]# cat a.sh
#!/bin/bash

echo $*
echo $@
echo $#

[root@localhost tmp]# . a.sh 10 20 30
10 20 30
10 20 30
3

示例:判斷給出的文件的行數
#!/bin/bash
linecount="$(wc -l $1 | cut -d‘ ‘ -f1)"
echo "$1 has $linecount lines."

[root@localhost tmp]# cat a.sh
#!/bin/bash

linecount=wc -l $1 | cut -d‘ ‘ -f1
echo "$1 has $linecount lines."
[root@localhost tmp]# . a.sh /etc/passwd
/etc/passwd has 31 lines.

bash的配置文件
按生效範圍劃分,存在兩類:
全局配置:
/etc/profile、/etc/profile.d/*.sh、/etc/bashrc
個人配置:
~/.bash_profile、~/.bashrc

按功能劃分,存在兩類
profile類:為交互式登錄的shell提供配置
全局 /etc/profile、/etc/profile.d/*.sh
個人 ~/.bash_profile
功用:1、用於定義環境變量、2、運行命令或腳本

bashrc類:為非交互式登錄的shell提供配置
全局 /etc/bashrc
個人 ~/.bashrc
功用:1、定義命令別名、2、定義本地變量

shell登錄:
交互式登錄:
直接通過終端輸入賬號密碼登錄;
使用"su - username" 或"su -l username"切換的用戶
讀取配置文件的次序 /etc/profile -- /etc/profile.d/*.sh -- ~/.bash_profile -- ~/.bashrc -- /etc/bashrc

非交互式登錄:
su username
圖形界面打開的終端
執行腳本
讀取配置文件的次序 ~/.bashrc -- /etc/bashrc -- /etc/profile.d/*.sh

編輯配置文件定義的新配置的生效方式
1、重新啟動shell進程
2、使用source或.命令進程

問題:
1、定義對所有用戶都生效的別名;/etc/bashrc
2、讓用戶的PATH環境變量的值多出一個路徑,例如多出/usr/local/apache2/bin
管理員 export PATH=$PATH:/usr/local/apache/bin
所有用戶
/etc/profile.d/path.sh
export PATH=$PATH:/usr/local/apache/bin

~/.bash_profile
export PATH=$PATH:/usr/local/apache/bin

bash中的算術運算

      • / % **(乘方)

實現算術運算
1、let var=算術表達式
[root@localhost ~]# num1=10
[root@localhost ~]# num2=20
[root@localhost ~]# let num3=num1+num2
[root@localhost ~]# echo $num3
30

2、var=$[算術表達式]
[root@localhost ~]# num3=$[$num1-$num2]
[root@localhost ~]# echo $num3
-10

3、var=$((算術表達式))
[root@localhost ~]# num3=$(($num1*$num2))
[root@localhost ~]# echo $num3
200

4、var=$(expr arg1 arg2 arg3)
[root@localhost ~]# num3=$(expr $num2 / $num1)
[root@localhost ~]# echo $num3
2

乘法符號在某些場景中需要轉義

bash有內建的隨機生成器:$RANDOM
[root@localhost ~]# echo $RANDOM
2756
[root@localhost ~]# echo $[$RANDOM/2]
10492

增強型賦值
+=、-=、*=、/=、%=

let varOPERvalue
例如:let count+=1

自增、自減
let var+=1
let var++

let var-=1
let var--

練習1:寫一個腳本
計算/etc/passwd文件中的第10個用戶和第20個用戶的ID之和
[root@localhost ~]# cat /tmp/a.sh
#!/bin/bash

num1=head -10 /etc/passwd | tail -1 | cut -d: -f3
num2=head -20 /etc/passwd | tail -1 | cut -d: -f3

num3=$[$num1+$num2]
echo "the sum is $num3."
[root@localhost ~]# . /tmp/a.sh
the sum is 517.

練習2:寫一個腳本
傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和
[root@localhost ~]# cat /tmp/a.sh
#!/bin/bash

num1=grep "^[[:space:]]*$" $1 | wc -l
num2=grep "^[[:space:]]*$" $2 | wc -l

echo "the spacelinesum is $[$num1+$num2]."

[root@localhost ~]# . /tmp/a.sh /etc/fstab /etc/issue
the spacelinesum is 2.

練習3:統計/etc、/var、/usr目錄共有多少個一級子目錄和文件
[root@localhost ~]# cat /tmp/a.sh
#!/bin/bash

num1=ls /etc | wc -l
num2=ls /var | wc -l
num3=ls /usr | wc -l

echo "the filecounts is $[$num1+$num2+$num3]."

[root@localhost ~]# . /tmp/a.sh
the filecounts is 172.

條件測試:
判斷某需求是否滿足,需要由測試機制來實現

註意:專用的測試表達式需要由測試命令輔助完成測試過程;

測試命令:
test expression
[root@localhost ~]# test 10 -lt 20
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 10 -gt 20
[root@localhost ~]# echo $?
1

[ expression ]
[root@localhost ~]# [ 10 -lt 20 ]
[root@localhost ~]# echo $?
0

[[ expression ]]
[root@localhost ~]# [[ 10 -gt 20 ]]
[root@localhost ~]# echo $?
1

註意:expression 前後必須有空白字符

bash的測試類型
數值測試:
-gt 是否大於
[root@localhost ~]# test 10 -gt 20
[root@localhost ~]# echo $?
1

-ge 是否大於等於
[root@localhost ~]# test 10 -ge 20
[root@localhost ~]# echo $?
1

-eq 是否等於
[root@localhost ~]# test 10 -eq 20
[root@localhost ~]# echo $?
1

-ne 是否不等於
[root@localhost ~]# test 10 -ne 20
[root@localhost ~]# echo $?
0

-lt 是否小於
[root@localhost ~]# test 10 -lt 20
[root@localhost ~]# echo $?
0

-le 是否小於等於
[root@localhost ~]# test 10 -le 20
[root@localhost ~]# echo $?
0

字符串測試
== 是否等於
[root@localhost ~]# test abc == ABC
[root@localhost ~]# echo $?
1

是否大於
[root@localhost ~]# test abc > ABC
[root@localhost ~]# echo $?
0

< 是否小於
[root@localhost ~]# test abc < ABC
[root@localhost ~]# echo $?
0

!= 是否不等於
[root@localhost ~]# test abc != ABC
[root@localhost ~]# echo $?
0
=~ 左側字符串是否能夠被右側的pattern所匹配,註意:此表達式一般用於[[ ]]中
[root@localhost ~]# [[ "root" =~ ^r ]]
[root@localhost ~]# echo $?
0

-z "string" 測試字符串是否為空,空則為真,不空則為假
[root@localhost ~]# name=tom
[root@localhost ~]# [ -z "$name" ]
[root@localhost ~]# echo $?
1

-n "string" 測試字符串是否不空,不空則為真,空則為假
[root@localhost ~]# [ -n "$name" ]
[root@localhost ~]# echo $?
0

bash自定義退出狀態碼
exit [n] 自定義退出狀態碼
註意:腳本中一旦遇到exit 命令,腳本會立即終止,終止退出狀態取決於exit命令後面的數字
[root@localhost ~]# cat /tmp/a.sh
#!/bin/bash

cat /etc/issue &> /dev/null
catt /etc/issue &> /dev/null
exit 1

[root@localhost ~]# . /tmp/a.sh
[root@localhost ~]# echo $?
1

註意:如果未給出腳本指定退出狀態碼,整個腳本的退出狀態碼取決於腳本中執行的最後一條命令的狀態碼
[root@localhost ~]# cat /tmp/a.sh
#!/bin/bash

cat /etc/issue &> /dev/null
catt /etc/issue &> /dev/null

[root@localhost ~]# . /tmp/a.sh
[root@localhost ~]# echo $?
127

練習:寫一個腳本
接受一個文件路徑作為參數
如果參數個數小於1,則提示用戶"至少應該給一個參數",並立即退出;
如果參數個數不小於1,則顯示第一個參數所指向的文件中的空白行數;
[root@localhost ~]# cat /tmp/a.sh
#!/bin/bash

[ $# -lt 1 ] && echo "usage:$0 argu1"
[ $# -ge 1 ] && grep "^[[:space:]]*$" $1 | wc -l
[root@localhost ~]# . /tmp/a.sh
usage:-bash argu1
[root@localhost ~]# . /tmp/a.sh /etc/fstab
1
[root@localhost ~]# . /tmp/a.sh /etc/fstab /etc/passwd
1

vim編輯器
vi visual interface 文件編輯器
文本:ASCII unicode
文本編輯種類:
行編輯器 sed
全屏編輯器 nano

vim vi improved vi的增強版
vim 模式化的編輯
基本模式
編輯模式,也稱作命令模式
輸入模式
末行模式:內置的命令行接口

打開文件:
vim [option]... file...
+# 打開文件後,直接讓光標處於第#行的行首
+/PATTERN 打開文件後,直接讓光標處於第一個被PATTERN匹配到的行的行首

模式轉換
編輯模式 --> 輸入模式
i insert 在光標所在處輸入
a append 在光標所在處後面輸入
o 在當前光標所在行的下方打開一個新行
I 在當前光標所在行的行首輸入
A 在當前光標所在行的行尾輸入
O 在當前光標所在行的上方打開一個新行

輸入模式 --> 編輯模式
ESC

編輯模式 --> 末行模式
:

末行模式 --> 編輯模式
ESC

關閉文件
:q 退出
:q! 強制退出,丟棄做出的修改
:wq 保存退出
:x 保存退出
:w /path/to/somewhere 另存為另外一個文件,該文件可為已存在文件,亦可為不存在文件

ZZ 保存退出 編輯模式的保存退出

光標跳轉
字符間跳轉
h 向左跳轉 l 向右跳轉 j 向下跳轉 k 向上跳轉

#command 跳轉由#指定的個數的字符 即跳轉#個字符

單詞間跳轉
w 下一個單詞的詞首
e 當前或下一個單詞的詞尾
b 當前或前一個單詞的詞首

#command 由#指定一個跳轉的單詞數 即跳轉#個單詞

詞首詞尾跳轉
^ 跳轉至行首的第一個非空白字符
0 跳轉至行首
$ 跳轉到行尾

行間跳轉
#G 跳轉至由#指定行 跳轉至第#行
G 跳轉至最後一行
1G或gg 跳轉至第一行

句間移動
) 跳轉至下一句
( 跳轉至上一句

段落間移動
} 跳轉至下一段
{ 跳轉至上一段

vim的編輯命令
x 刪除光標處的字符
#x 刪除光標處起始的#個字符

xp 交換光標所在處的字符及其後面字符的位置

替換命令(r replace)
r 替換光標所在處的字符

刪除命令
d 刪除命令,可結合光標跳轉字符使用,實現範圍刪除
d$ d^ d0
dw de db

#command 刪除#個字符

dd 刪除光標所在處的行
#dd 刪除多行

粘貼命令(p put paste)
p 緩沖區中存儲的如果為整行,則粘貼至當前光標所在行的下方,否則,則粘貼至當前光標所在處的後面
P 緩存區中存儲的如果為整行,則粘貼至當前光標所在行的上方,否則,則粘貼至當前光標處在出的前面

復制命令(y yank)
y 復制,工作行為相似於d命令
y$ y ^ y0
yw ye yb

#command 復制#個字符

yy 復制光標所在處的行
#yy 復制多行

改變命令(c change)
c 修改
編輯模式 --> 輸入模式
工作行為相似於d命令
c$ c^ c0
cw ce cb

#command 修改#個字符

cc 刪除行並輸入新內容
#cc 刪除#行並輸入新內容

其他編輯操作

可視化模式
v 按字符選定
V 按行選定

註意 經常結合編輯命令使用 d c y

撤銷此前的編輯
u (undo) 撤銷此前的操作
#u 撤銷指定次數的操作

撤銷此前的撤銷
ctrl+r

重復前一個編輯操作
.(點號)

翻屏操作
ctrl+f 向文件尾部翻一屏
ctrl+b 向文件首部翻一屏

ctrl+d 向文件尾部翻半屏
ctrl+u 向文件首部翻半屏

vim自帶的練習教程 vimtutor

vim的末行模式 內建的命令行接口

1、地址定界
:start_pos,end_pos

具體第#行,例如2表示第2行

#,# 從左側#表示起始行,到右側#表示行結尾
#,+# 從左側#表示的行起始,加上右側#表示的行數
. 當前行
$ 最後一行
.,$-1 表示當前行-倒數第二行
% 全文,相當於1,$

/pat1/,/pat2/ 從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結束
#,/pat/ 從第#行開始到第一次被pat匹配到的行結束
/pat/,$ 從第一次被pat匹配到的行開始到文本的最後一行結束

使用方式:後跟一個編輯命令
d 刪除
y 復制
w /path/to/somewhere 將範圍內的行另存到指定的文件中 該文件可以是已經存在,或者不存在
r /path/from/somefile 在指定位置插入指定文件中的所有內容

2、查找字符串
/pattern 從當前光標所在處向文件尾部查找
?pattern 從當前光標所在處向文件首部查找
n 與命令同方向查找下一個
N 與命令反方向查找下一個
註意:亦可使用正則表達式查找字符串

3、查找並替換
s 在末行模式下完成查找替換操作
s /要查找的內容/替換為的內容/修飾符
要查找的內容 可使用模式
替換為的內容 不能使用模式,但可以使用\1,\2,... 等後向應用符號,還可以使用"&"引用前面查找時查找到的整個內容
修飾符:
i 忽略大小寫
g 全局替換,默認情況下,每一行只替換第一次出現的內容查找替換中的分隔符/可替換為其他字符,例如
s@@@
br/>查找替換中的分隔符/可替換為其他字符,例如
s@@@

練習:
1、復制/etc/grub2.cfg至/tmp/目錄,用查找替換命令刪除/tmp/grub2.cfg文件中的行首的空白字符
:%s/^[[:space:]]+//g

2、復制/etc/rc.d/init.d/functions文件至/tmp/目錄,用查找替換命令為/tmp/functions的每行開頭為空白字符的行的行首添加一個#號
      :%s/^[[:space:]]/#&/g

vim多文件模式
vim file1 file2 file3...
next 下一個 perv 上一個 first 第一個 last 最後一個
wall 保存所有 qall 退出所有

窗口分割模式
vim -o|-O file1 file2...
-o 水平分割
-O 垂直分割
在窗口間切換 ctrl+w,arrow(箭頭方向鍵)

單文件窗口分割
ctrl+w,s split 水平分割
ctrl+w,v vertical 垂直分割

定制vim的工作特性
配置文件 永久有效
全局 /etc/vimic
個人 ~/.vimrc 需要手動創建
末行模式 當前vim進程有效

1、行號
顯示 set number 簡寫為 set nu
取消顯示 set nonumber 簡寫為 set nonu
2、括號匹配
匹配 set showmatch 簡寫為set sm
取消匹配 set noshowmatch 簡寫為set nosm
3、自動縮進
啟用 set ai 禁用 set noai
4、高亮搜索
啟用 set hlsearch 禁用 set nohlsearch
5、語法高亮
啟用 syntax on 禁用 syntax off
6、忽略字符的大小寫
啟用 set ic 禁用 set noic

獲取幫助 help (help subject)

練習1、復制/etc/rc.d/init.d/functions文件至/tmp目錄,替換/tmp/functions文件中的/etc/sysconfig/init為/var/log;
:%s@/etc/sysconfig/init@/var/log@g
br/>1、復制/etc/rc.d/init.d/functions文件至/tmp目錄,替換/tmp/functions文件中的/etc/sysconfig/init為/var/log;
:%s@/etc/sysconfig/init@/var/log@g
:%s@#([[:space:]]+)@\1@g

bash條件測試
測試方式
test expression
[ expression ]
[[ expression ]]

測試表達式的類別
數值比較 字符串測試 文件測試

文件測試
存在性測試
-a file 文件是否存在
[root@localhost ~]# test -a /etc/passwd
[root@localhost ~]# echo $?
0

-e file 文件存在性測試,存在為真,否則為假
[root@localhost ~]# test -e /etc/passwd
[root@localhost ~]# echo $?
0

存在性及類別測試
-b file 是否存在且為塊設備文件
[root@localhost ~]# test -b /dev/sda
[root@localhost ~]# echo $?
0

-c file 是否存在且為字符設備文件
[root@localhost ~]# test -c /dev/tty
[root@localhost ~]# echo $?
0

-d file 是否存在且為目錄文件
[root@localhost ~]# test -d /dev
[root@localhost ~]# echo $?
0

-f file 是否存在且為普通文件
[root@localhost ~]# test -f /etc/passwd
[root@localhost ~]# echo $?
0

-h file 或 -L file 是否存在且為符號鏈接文件
[root@localhost ~]# test -h /etc/system-release
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -L /etc/system-release
[root@localhost ~]# echo $?
0

-p file 是否存在且為命名管道文件
[root@localhost ~]# test -p /var/spool/postfix/public/qmgr
[root@localhost ~]# echo $?
0

-S file 是否存在且為套接字文件
[root@localhost ~]# test -S /dev/log
[root@localhost ~]# echo $?
0

文件權限測試
-r file 是否存在且可讀
[root@localhost ~]# test -r /etc/passwd
[root@localhost ~]# echo $?
0

-w file 是否存在且可寫
[root@localhost ~]# test -w /etc/passwd
[root@localhost ~]# echo $?
0

-x file 是否存在且可執行
[root@localhost ~]# test -x /tmp/a.sh
[root@localhost ~]# echo $?
0

文件特殊權限測試
-g file 是否存在且擁有sgid權限
[root@localhost ~]# test -g /tmp
[root@localhost ~]# echo $?
0

-u file 是否存在且擁有suid權限
[root@localhost ~]# test -u /tmp
[root@localhost ~]# echo $?
0

-k file 是否存在且擁有sticky權限
[root@localhost ~]# test -k /tmp
[root@localhost ~]# echo $?
0

文件大小測試
-s file 是否存在且非空
[root@localhost ~]# test -s /etc/passwd
[root@localhost ~]# echo $?
0

文件是否打開
-t fd fd表示文件描述符是否已經打開且與某終端相關

-N file 文件自從上一次被讀取之後是否被修改過
[root@localhost ~]# test -N /etc/passwd
[root@localhost ~]# echo $?
1

-O file 當前有效用戶是否為文件屬主
[root@localhost ~]# test -O /etc/passwd
[root@localhost ~]# echo $?
0

-G file 當前有效用於是否為文件屬組
[root@localhost ~]# test -G /etc/passwd
[root@localhost ~]# echo $?
0

雙目測試
file1 -ef file2 file1與file2 是否指向同一個設備上的相同的inode
[root@localhost ~]# test /etc/passwd -ef /tmp/passwd
[root@localhost ~]# echo $?
1

file1 -nt file2 file1是否新於file2
[root@localhost ~]# test /etc/passwd -nt /tmp/passwd
[root@localhost ~]# echo $?
1

file1 -ot file2 file1是否舊於file2
[root@localhost ~]# test /etc/passwd -ot /tmp/passwd
[root@localhost ~]# echo $?
0

組合測試條件
邏輯運算
第一種方式
command1 && command2
[root@localhost ~]# test -e /etc/passwd && test -r /etc/passwd
[root@localhost ~]# echo $?
0

command1 || command2
[root@localhost ~]# test -e /etc/passwd || test -x /etc/passwd
[root@localhost ~]# echo $?
0

! command
[root@localhost ~]# ! test -e /etc/passwd
[root@localhost ~]# echo $?
1

[ -e file ] && [ -r file ]

第二種方式
expression1 -a expression2
[root@localhost ~]# [ -e /etc/passwd -a -r /etc/passwd ]
[root@localhost ~]# echo $?
0

expression1 -o expression2
[root@localhost ~]# [ -e /etc/passwd -o -x /etc/passwd ]
[root@localhost ~]# echo $?
0

! expression
[root@localhost ~]# [ ! -e /etc/passwd ]
[root@localhost ~]# echo $?
1

必須使用測試命令進行

[ -z "$hostname" -o "$hostname"=="localhost.localdomain" ] && hostname www.abc.com
[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

egrep、bash環境配置及腳本、vim編輯器