一、命令詳解
1.1然磷、命令說明
一條shell命令包含三個要素:命令名稱刊驴、選項、參數(shù),格式如下:
# 注意 $表示普通用戶捆憎,#代表超級用戶;
# command命令嚴格區(qū)分大小寫
# ptions參數(shù)由"-"引導(dǎo)
$ command [options] argument1 argument1
# 另外
# 一條命令的三要素用空格隔開
# 若將多個命令在一行書寫,用分號';‘ 隔開
# 如果一條命令不能在一行寫完致份,在行尾使用反斜杠 \ 標明該條命令還未結(jié)束
1.2础拨、別名绍载、函數(shù)滔蝉、內(nèi)置命令、程序執(zhí)行順序
一個命令的別名(alias)锰提、函數(shù)(function),內(nèi)置命令(builtin)和程序(program)的執(zhí)行優(yōu)先次序
先 alias --> function --> builtin --> program 后
驗證:
#把test命名為ls -l的別名
$ alias test="ls -l"
#執(zhí)行test命令 边坤,結(jié)果表明優(yōu)先執(zhí)行alias
[root@iZbp18i0nt28c8wyrod16yZ ~]# test
total 16
drwxr-xr-x 3 root root 4096 Aug 2 17:17 fanwh
drwxr-xr-x 8 root root 4096 Aug 2 15:36 oneinstack
-rw-r--r-- 1 root root 475 Aug 2 15:36 ReadMe
drwxr-xr-x 2 root root 4096 Aug 2 18:27 tmp
##############################################################
#定義一個function
[root@iZbp18i0nt28c8wyrod16yZ ~]# function test { echo "hi, I'm a function"; }
#再次執(zhí)行發(fā)現(xiàn)還是執(zhí)行的alias
[root@iZbp18i0nt28c8wyrod16yZ ~]# test
total 16
drwxr-xr-x 3 root root 4096 Aug 2 17:17 fanwh
drwxr-xr-x 8 root root 4096 Aug 2 15:36 oneinstack
-rw-r--r-- 1 root root 475 Aug 2 15:36 ReadMe
drwxr-xr-x 2 root root 4096 Aug 2 18:27 tmp
##############################################################
# 刪除alias谅年,再次執(zhí)行發(fā)現(xiàn)執(zhí)行的是function
[root@iZbp18i0nt28c8wyrod16yZ ~]# unalias test
[root@iZbp18i0nt28c8wyrod16yZ ~]# test
hi, I'm a function
##############################################################
# 如果要執(zhí)行內(nèi)置test命令
[root@iZbp18i0nt28c8wyrod16yZ ~]# builtin test
##############################################################
# 使用type查看可以發(fā)現(xiàn)命令執(zhí)行優(yōu)先級
[root@iZbp18i0nt28c8wyrod16yZ ~]# type -a test
test is aliased to `ls -l'
test is a function
test ()
{
echo "hi, I'm a function"
}
test is a shell builtin
test is /usr/bin/test
##############################################################
1.3、/bin/bash的啟動
我們知道/bin/bash由/bin/login啟動;那么/bin/login如何知道應(yīng)該啟動哪個bash旺订?實際上/bin/login程序會檢查我們的/etc/passwd文件超燃,在這個文件里頭包含了用戶名、密碼和該用戶的登錄shell意乓。密碼和用戶名匹配用戶的登錄,而登錄shell則作為用戶登錄后的命令行程序笆凌。
可通過/etc/passwd文件查看當前用戶的登錄shell:
[root@iZbp18i0nt28c8wyrod16yZ ~]# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#其中x表示密碼被保護士葫,存放在/etc/shadow文件,當然是加密的慢显。
# 整體而言: /sbin/init -> /bin/login - > /bin/bash
# 進一步細化 : fork execve execve fork execve
# init --> init --> /sbin/getty --> /bin/login --> /bin/login --> /bin/bash
1.4、strace查看命令執(zhí)行過程
查看命令執(zhí)行情況,并輸出到strace.out文件;例如 查看bin/login命令的執(zhí)行
strace -f -o strace.out /bin/login
1.5呻右、type查看命令類型及命令如何被執(zhí)行
如查看test命令的執(zhí)行鞋喇,詳情可查看命令手冊man type
[root@iZbp18i0nt28c8wyrod16yZ kooder]# type test
test is a shell builtin
1.6、同命令不同path
先看看PATH環(huán)境變量,確保它有/usr/bin,/bin和/usr/local/sbin這幾個目錄纽疟,然后通過type -P(-P參數(shù)強制到PATH下查找憾赁,而不管是別名還是內(nèi)置命令等,可以通過help type查看該參數(shù)的含義)查看龙考,到底哪個先被執(zhí)行
$ echo $PATH
[root@iZbp18i0nt28c8wyrod16yZ ~]# echo $PATH
/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/mysql/bin:/usr/local/java/jdk1.8.0_211/bin:/root/fanwh/kooder/apache-maven-3.9.3//bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 規(guī)律如下:
#shell從PATH列出的路徑中依次查找用戶輸入的命令⊙坠Γ考慮到程序的優(yōu)先級最低缓溅,如果想優(yōu)先執(zhí)行磁盤上的程序文件test呢?
#那么就可以用test -P找出這個文件并執(zhí)行就可以了
1.7坛怪、重定向
重定向操作符: >,<,>>,<<,<>,|
# >>在輸出時追加到文件末尾,而>則會從頭開始寫入文件更啄,前者意味著文件的大小會增長居灯,而后者則意味文件被重寫
# <字符表示:把test.c文件重定向為標準輸入,作為cat命令的輸入穆壕,而cat默認把內(nèi)容輸出到標準輸出其屏。
$ cat < ./test.c
# >表示把標準輸出重定向為文件test_new.c,結(jié)果內(nèi)容輸出到test_new.c
$ cat < ./test.c > test_new.c
#| 被形象地稱為“管道”川背,實際上它就是通過C語言里頭的無名管道來實現(xiàn)的,如下列命令蛤袒,只打印了包含hi的字符串行
$ cat < ./test.c | grep hi
#管道如何實現(xiàn)? 它通過C語言里頭的pipe函數(shù)創(chuàng)建了一個管道(一個包含兩個文件描述符的整形數(shù)組,
#一個描述符用于寫入數(shù)據(jù)妙真,一個描述符用于讀入數(shù)據(jù)),并且通過 dup/fcntl把cat的輸出復(fù)制到了管道的輸入练般,
#而把管道的輸出則復(fù)制到了grep的輸入。這真是一個奇妙的想法薄料。
# & 當你在程序的最后跟上這個奇妙的字符以后就可以接著做其他事情了,例如下列代碼讓程序在后臺運行
$ sleep 50 &
#在命令的后面加上&后誊役,該命令將被作為后臺進程執(zhí)行谷市,后臺進程是什么呢?
#這類進程無法接收用戶發(fā)送給終端的信號(如 SIGHUP,SIGQUIT,SIGINT)歌懒,無法響應(yīng)鍵盤輸入(被前臺進程占用著),
#不過可以通過fg切換到前臺而享受作為前臺進程具有的特權(quán)甫男。
二验烧、字符串
2.1、字符串定義
單引號 單引號里的任何字符都會原樣輸出碍拆,單引號字符串中的變量是無效的
[root@iZbp18i0nt28c8wyrod16yZ kooder]# name='hello $'
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo name
name
雙引號 可以在雙引號中使用變量;可以在雙引號中使用轉(zhuǎn)義字符
[root@iZbp18i0nt28c8wyrod16yZ kooder]# name="hallo";
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo "my name is ${name}";
my name is hallo
2.2、字符串長度
#使用 #取字符串長度
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo ${string}
abcd
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo ${#string}
4
2.3端幼、字符串截取
# 截取字符串弧满,
[root@iZbp18i0nt28c8wyrod16yZ kooder]# string="this is a text"
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo ${string:2:6}
is is
2.4、字符索引位置查詢
查找字符串中首次出現(xiàn)的位置,多個字符時庭呜,顯示第一個字符出現(xiàn)的位置
[root@iZbp18i0nt28c8wyrod16yZ kooder]# string="this is a text"
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo `expr index "$string" i`
3
三、數(shù)組
3.1扶关、數(shù)組定義與讀取
# 數(shù)組定義数冬,常用
[root@iZbp18i0nt28c8wyrod16yZ kooder]# array_name=(value1 value2 value3 value4)
# 讀取所有元素
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo ${array_name[@]}
value1 value2 value3 value4
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo ${array_name[*]}
value1 value2 value3 value4
# 讀取數(shù)組長度
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo ${#array_name[*]}
4
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo ${#array_name[@]}
4
# 取指定索引位置元素長度
[root@iZbp18i0nt28c8wyrod16yZ kooder]# echo ${#array_name[0]}
6
四、參數(shù)
4.1铜异、腳本傳參
在執(zhí)行 Shell 腳本時,向腳本傳遞參數(shù)熙掺,腳本內(nèi)獲取參數(shù)的格式為:$n。n 代表一個數(shù)字蜡秽,1 為執(zhí)行腳本的第一個參數(shù)缆镣,2 為執(zhí)行腳本的第二個參數(shù),以此類推……董瞻,
[root@iZbp18i0nt28c8wyrod16yZ kooder]# vim test.sh
# 編輯test.sh內(nèi)容如下:
# echo "傳遞參數(shù)實例!";
# echo "執(zhí)行的文件名:$0";
# echo "第一個參數(shù)為:$1";
# echo "第二個參數(shù)為:$2";
# echo "第三個參數(shù)為:$3";
[root@iZbp18i0nt28c8wyrod16yZ kooder]# chmod +x test.sh
[root@iZbp18i0nt28c8wyrod16yZ kooder]# ./test.sh a b c
#輸出結(jié)果
# 傳遞參數(shù)實例挟秤!
# 執(zhí)行的文件名:./test.sh
# 第一個參數(shù)為:a
# 第二個參數(shù)為:b
# 第三個參數(shù)為:c
4.2抄伍、參數(shù)處理
$# 傳遞到腳本的參數(shù)個數(shù)
$* 以一個單字符串顯示所有向腳本傳遞的參數(shù)。 如”$*“用「”」括起來的情況截珍、以”$1 $2 … $n”的形式輸出所有參數(shù)。
$$ 當前進程ID號
$! 取上一條指令的PID秋度;后臺運行的最后一個進程的ID號
$@ 與? 相 同 钱床, 但 是 使 用 時 加 引 號 , 并 在 引 號 中 返 回 每 個 參 數(shù) 诞丽。 如 ” *相同拐格,但是使用時加引號,并在引號中返回每個參數(shù)捏浊。 如”?相同,但是使用時加引號浊洞,并在引號中返回每個參數(shù)。如”@“用「”」括起來的情況法希、以”$1″ “2 ” … ” 2″ … “2”…”n” 的形式輸出所有參數(shù)。
$- 顯示Shell使用的當前選項毛肋,與set命令功能相同屋剑。
$? 顯示最后命令的退出狀態(tài)。0表示沒有錯誤唉匾,其他任何值表明有錯誤。
4.3厂财、算術(shù)運算
shell中不支持簡單的數(shù)學(xué)運算峡懈,如使用算符運算符就需要搭配的常用的工具有兩種 1、awk 暫不做分析 2逮诲、expr (使用頻繁)
#運算規(guī)則注意:
#表達式和運算符之間必須要有空格,例如 3+2 是不對的裆甩,必須寫成 3 + 2
#完整的表達式要被 兩個” ` “包含(在 Esc 鍵下邊那個鍵)
#在windows系統(tǒng)中乘號(*)前邊必須加反斜杠()才能實現(xiàn)乘法運算
var=`expr 2 + 3`
echo $var
4.4齐唆、關(guān)系運算
shell中的關(guān)系運算符和其他編程語言不同,shell中使用特殊的字符表示關(guān)系運算符箍邮,并且只支持數(shù)字,不支持字符串堪澎,除非字符串是數(shù)字味滞。注意 運算符和數(shù)之間必須要用空格隔開
運算規(guī)則如下:
# 檢測兩個數(shù)是否相等钮呀,相等返回 true;如 [ $a -eq $b ] 返回 false。
-eq
# 檢測兩個數(shù)是否不相等爽醋,不相等返回 true便脊;如[ $a -ne $b ] 返回 true。
-ne
# 檢測左邊的數(shù)是否大于右邊的哪痰,如果是,則返回 true解愤;如[ $a -gt $b ] 返回 false乎莉。
-gt
# 檢測左邊的數(shù)是否小于右邊的,如果是惋啃,則返回 true;[ $a -lt $b ] 返回 true异希。
-lt
# 檢測左邊的數(shù)是否大于等于右邊的绒瘦,如果是,則返回 true惰帽;[ $a -ge $b ] 返回 false。
-ge
# 檢測左邊的數(shù)是否小于等于右邊的授药,如果是呜魄,則返回 true;[ $a -le $b ] 返回 true爵嗅。
-le
4.5、邏輯與布爾運算
# 非運算九火,表達式為 true 則返回 false册招,否則返回 true;[ ! false ] 返回 true是掰。
!
# 或運算,有一個表達式為 true 則返回 true;[ $a -lt 20 -o $b -gt 100 ] 返回 true炫彩。
-o
# 與運算絮短,兩個表達式都為 true 才返回 true;[ $a -lt 20 -a $b -gt 100 ] 返回 false。
-a
# 邏輯的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
&&
# 邏輯的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
||
# 注意 這里使用兩層的[ ]符號丁频,將兩次關(guān)系運算的結(jié)果保存在條件句中
4.6、字符串運算
# 檢測兩個字符串是否相等叔磷,相等返回 true;[ $a = $b ] 返回 false奖磁。
=
# 檢測兩個字符串是否相等,不相等返回 true;[ $a != $b ] 返回 true咖为。
!=
# 檢測字符串長度是否為0,為0返回 true;[ -z $a ] 返回 false封恰。
-z
# 檢測字符串長度是否不為 0褐啡,不為 0 返回 true;[ -n “$a” ] 返回 true。
-n
# 檢測字符串是否為空备畦,不為空返回 true;[ $a ] 返回 true。
$
4.7褥赊、文件測試運算符
shell中的文件測試運算符用于檢測在類unix系統(tǒng)中莉恼,文件的各種屬性
# 檢測文件是否是塊設(shè)備文件速那,如果是尿背,則返回 true ; [ -b $file ] 返回 false。
-b file
# 檢測文件是否是字符設(shè)備文件田藐,如果是仪糖,則返回 true;[ -c $file ] 返回 false。
-c file
# 檢測文件是否是目錄景醇,如果是,則返回 true;[ -d $file ] 返回 false三痰。
-d file
# 檢測文件是否是普通文件(既不是目錄,也不是設(shè)備文件)撮执,如果是舷丹,則返回 true;[ -f $file ] 返回 true。
-f file
# 檢測文件是否設(shè)置了 SGID 位颜凯,如果是,則返回 true;[ -g $file ] 返回 false蕾额。
-g file
# 檢測文件是否設(shè)置了粘著位(Sticky Bit)彼城,如果是,則返回 true;[ -k $file ] 返回 false募壕。
-k file
# 檢測文件是否是有名管道,如果是缰泡,則返回 true;[ -p $file ] 返回 false代嗤。
-p file
# 檢測文件是否設(shè)置了 SUID 位缠借,如果是宜猜,則返回 true;[ -u $file ] 返回 false。
-u file
# 檢測文件是否可讀宝恶,如果是趴捅,則返回 true;[ -r $file ] 返回 true拱绑。
-r file
# 檢測文件是否可寫,如果是猎拨,則返回 true;[ -w $file ] 返回 true。
-w file
# 檢測文件是否可執(zhí)行额各,如果是吧恃,則返回 true;[ -x $file ] 返回 true。
-x file
# 檢測文件是否為空(文件大小是否大于0)痕寓,不為空返回 true;[ -s $file ] 返回 true。
-s file
# 檢測文件(包括目錄)是否存在硬毕,且至少有一個字符則為真礼仗;如果是,則返回 true;[ -e $file ] 返回 true元践。
-e file
五、echo與printf
echo
echo -e "Right!\n " # -e 表示開啟轉(zhuǎn)義
echo "this is a test" > testfile
printf
# 警告字符乾蓬,通常為ASCII的BEL字符
\a
# 后退
\b
# 抑制(不顯示)輸出結(jié)果中任何結(jié)尾的換行字符(只在%b格式指示符控制下的參數(shù)字符串中有效)慎恒,而且撵渡,任何留在參數(shù)里的字符死嗦、任何接下來的參數(shù)以及任何留在格式字符串中的字符,都被忽略
\c
# 換頁(formfeed)
\f
# 換行
\n
# 回車(Carriage return)
\r
# 水平制表符
\t
# 垂直制表符
\v
# 一個字面上的反斜杠字符
\
# 表示1到3位數(shù)八進制值的字符越除。僅在格式字符串中有效
\ddd
# 表示1到3位的八進制值字符
\0ddd
六摘盆、test
test 命令用于檢查某個條件是否成立,它可以進行數(shù)值孩擂、字符和文件三個方面的測試
# 等于則為真,如: if test $[a] -eq $[a] then
-eq
# 不等于則為真,如: if test $[a] -ne $[a] then
-ne
# 大于則為真,如:if test $[a] -gt $[a] then
-gt
# 大于等于則為真,如:if test $[a] -ge $[a] then
-ge
# 小于則為真,如:if test $[a] -lt $[a] then
-lt
# 小于等于則為真,如:if test $[a] -le $[a] then
-le
七、流程控制
7.1狈邑、if-else
#if-else格式模板
if - then - fi
# if-elseif格式模板
if -then elif then - fi
7.2蚤认、case
用case語句匹配一個值與一個模式,如果匹配成功砰琢,執(zhí)行相匹配的命令
case 值 in
模式1)
command1
commandN
;;
模式2)
command1
commandN
;;
esac
需要注意
# 取值后面需要加上in
# 每一模式必須以右括號結(jié)束
# 每個模式結(jié)束后使用;;符號結(jié)尾
# 如果沒有找到對應(yīng)的模式氯析。以*結(jié)尾,并跳出case
# case需要搭配esac結(jié)尾掩缓,與C語言中的switch … case語句類似
# demo如下
echo '輸入 1 到 4 之間的數(shù)字:'
echo '你輸入的數(shù)字為:'
read num
case $num in
1) echo '你選擇了 1'
;;
2) echo '你選擇了 2'
;;
3) echo '你選擇了 3'
;;
4) echo '你選擇了 4'
;;
*) echo '你沒有輸入 1 到 4 之間的數(shù)字'
;;
esac
# 與其他語言類似,case中想要跳出循環(huán)有兩個命令:break和continue
# break命令:允許跳出所有循環(huán)(中止執(zhí)行后面所有的循環(huán))
7.3巡通、for循環(huán)
for循環(huán)調(diào)用格式和python中的for循環(huán)有點類似
for var in item1 item2 ... itemN
do
command1
...
commandN
done
# in列表中可以包含替換舍哄、字符串和文件名等
# in列表是可選的,如果默認不適用表悬,將會循環(huán)使用命令行中的位置參數(shù)
7.4、while
while循環(huán)
while condition
do
command
done
# 如
num = 1
while(( $num<=5 ))
do
echo $num
let "num++"
done
使while循環(huán)進行判定或者判斷鍵盤循環(huán)籽暇,甚至無限循環(huán)
echo '按下 <Q> 退出'
echo -n '輸入你最喜歡的歌名: '
while read SONG
do
echo "啊熬荆!$SONG 真是一首好歌"
done
7.5绸狐、until循環(huán)
until 循環(huán)執(zhí)行一系列命令直至條件為 true 時停止卤恳。until 循環(huán)與 while 循環(huán)在處理方式上剛好相反寒矿。一般 while 循環(huán)優(yōu)于 until 循環(huán),但在某些時候—也只是極少數(shù)情況下本今,until 循環(huán)更加有用,語法格式如下:
until condition
do
command
done
# demo如下:
a=0
until [ ! $a -lt 5 ]
do
echo $a
a=`expr $a + 1`
done
八主巍、函數(shù)
8.1挪凑、定義函數(shù)
函數(shù)定義模板
[ function ] funname [()]
{
action;
[return int;]
}
function fun () 表示有返回參數(shù)的函數(shù)(如同C語言中的有返回類型的函數(shù)(int,char等))
fun() 表示無返回參數(shù)的函數(shù)(類似于C語言中的void類型函數(shù))
使用return可以返回參數(shù)值(一般為數(shù)值n)搞旭,如果不使用菇绵,將默認以最后一條命令運行的結(jié)果作為返回值,舉例如下:
FunReturn(){
echo "兩個數(shù)字進行相加運算..."
echo "輸入第一個數(shù)字: "
read num
echo "輸入第二個數(shù)字: "
read anothernum
echo "兩個數(shù)字分別為 $num 和 $anothernum !"
return $(($num+$anothernum)) # 分別返回數(shù)值
}
FunReturn # 調(diào)用函數(shù)
echo "輸入的兩個數(shù)字之和為 $? !" # 使用通配符獲取上一條指令的返回值咬最;$?前面我們講過,用來返回上一條指令執(zhí)行后的狀態(tài)值永乌,一般為0-255,這里可以理解為暫用
8.2翅雏、函數(shù)參數(shù)定義
使用shell函數(shù)傳遞參數(shù)時,需要在函數(shù)體的內(nèi)部望几,通過 n的形式來獲取參數(shù)的值绩脆,與其他語言不同的是,這不是在定義函數(shù)的時候就給定參數(shù),而是在函數(shù)體中獲取到的參數(shù)靴迫,例如祈坠,1表示第一個參數(shù)
#demo舉例
#!/bin/bash
FunParam(){
echo "輸入第一個參數(shù) $1 !"
echo "輸入第二個參數(shù) $2 !"
echo "輸入第十個個參數(shù) $10 !"
echo "參數(shù)總數(shù)共 $# 個!"
echo "作為一個字符串輸出所有參數(shù) $* !"
}
FunParam 1 2 3 4 5 6 7 8 9 10
九、重定向
9.1矢劲、通配符
用于處理查找一組名稱類型相同的文件赦拘,提高效率
通配符 | 含義 | 舉例 |
---|---|---|
星號(*) | 匹配任意長度的字符串 | 用ddd_*.txt,匹配ddd_zhang.txt躺同,ddd_le.txt,ddd_wang.txt等同類型文件 |
問號(?) | 匹配一個長度的字符 | 用ddd_?.txt丸逸,匹配ddd_1.txt蹋艺,ddd_2.txt,ddd_3.txt文件 |
方括號([…]) | 匹配其中指定的一個字符 | 用ddd_[otr].txt黄刚,匹配ddd_o.txt捎谨,ddd_t.txt,ddd_r.txt特定字符 |
方括號([ - ]) | 匹配指定的一個字符范圍 | 用ddd_[a-z].txt憔维,匹配ddd_a.txt涛救,ddd_b.txt,ddd_c.txt业扒,… 检吆,ddd_z.txt范圍內(nèi)的字符 |
方括號([^ …) | 除了其中指定的單個字符,均可匹配 | 用ddd_[ ^ otr ].txt程储,匹配除了ddd_o.txt蹭沛,ddd_t.txt,ddd_r.txt特定字符以外的其他字符 |
9.2章鲤、管道
管道可以將一些列命令連接起來摊灭,表示為第一個命令的輸出將作為第二個命令的輸入,通過管道傳遞給第二個命令败徊,第二個命令的輸出又作為第三個命令的輸入帚呼,以此類推,通常使用"|"符號連接命令管道;執(zhí)行管道命令只需要知道前一個命令的結(jié)果類型和下一個命令的入?yún)㈩愋图纯?
# 舉例 ls集嵌,統(tǒng)計ls的結(jié)果大小單位byte,具體wc命令推薦使用man手冊查看
ls | wc -c
# 可以使用 ls > ls_result.txt萝挤,查看ls執(zhí)行后的結(jié)果值
9.3、I/O重定向
Linux中的默認的標注輸入定義為從鍵盤輸入根欧,標準輸出定義為從終端窗口輸出怜珍;用于為當前操作改變輸入或者輸出,迫使某人特定命令的輸入或者輸出來源為外部文件
重定向符號 | 含義 | 實例 |
---|---|---|
>file | 將file文件重定向為輸出源凤粗,新建模式 | ls /usr >lsoutput.txt酥泛,將ls /usr命令的執(zhí)行結(jié)果今豆,寫到lsoutput.txt中去,如沒有此文件將新建柔袁,若存在此文件呆躲,將覆蓋 |
>>file | 將file文件重定向為輸出源,追加模式 | ls /usr >>lsoutput.txt捶索,將ls /usr命令的執(zhí)行結(jié)果插掂,追加到lsoutput.txt文件已有的內(nèi)容之后 |
<file | 將file文件重定向為輸入源 | wc < file1,將file1中的內(nèi)容作為輸入源傳給wc命令 |
2>或&> | 將由命令產(chǎn)生的錯誤信息輸入到文件中 | ls notexistfile.txt 2>err.log腥例,使用ls命令查看一個不存在的文件名的時候辅甥,將系統(tǒng)錯誤信息提示保存在err.log文件中 |
10、命令替換
10.1燎竖、通過vim編輯器來替換
# vi/vim 中可以使用 :s 命令來替換字符串璃弄。
:s/well/good/ 替換當前行第一個 well 為 good
:s/well/good/g 替換當前行所有 well 為 good
:n,$s/well/good/ 替換第 n 行開始到最后一行中每一行的第一個 well 為 good
:n,$s/well/good/g 替換第 n 行開始到最后一行中每一行所有 well 為 good n 為數(shù)字,若 n 為 .构回,表示從當前行開始到最后一行
:%s/well/good/(等同于 :g/well/s//good/) 替換每一行的第一個 well 為 good
:%s/well/good/g(等同于 :g/well/s//good/g) 替換每一行中所有 well 為 good 可以使用 # 作為分隔符夏块,此時中間出現(xiàn)的 / 不會作為分隔符
:s#well/#good/# 替換當前行第一個 well/ 為 good/
:%s#/usr/bin#/bin#g 可以把文件中所有路徑/usr/bin換成/bin
10.2、sed和grep配合
#將當前目錄(包括子目錄)中所有txt文件中的yyyy字符串替換為xxxx字符串
[root@iZbp18i0nt28c8wyrod16yZ ~]#sed -i s/yyyy/xxxx/g `grep yyyy -rl --include="*.txt" ./`
#命令解釋:
# -i表示操作的是文件
# s/yyyy/xxxx/g 替換所有行中的yyyy為xxxx纤掸,g表示替換所有
# `grep yyyy -rl --include="*.txt" ./` ,表示將grep命令的的結(jié)果作為操作文件
#僅需替換當前目錄下脐供,則直接使用即可
[root@iZbp18i0nt28c8wyrod16yZ ~]#sed -i s/xxxx/yyyy/g ./*.txt
10.3、find命令查找和替換
查找替換當前目錄下包含字符串并進行替換
find -name '要查找的文件名' | xargs perl -pi -e 's|被替換的字符串|替換后的字符串|g'
#命令解釋
# -name 需要查找的文件名
# xargs 從標準輸入構(gòu)建并執(zhí)行命令行
# perl Perl 5 language interpreter
# -p
99茁肠、參考資料
:http://www.cppblog.com/cuijixin/archive/2008/03/14/44463.html