作為可執(zhí)行程序
# 第一個(gè)腳本文件
#!/bin/bash
echo "Hello world!"
chmod +x ./test.sh #使得腳本具有執(zhí)行權(quán)限
./text.sh #執(zhí)行腳本,可以添加參數(shù)
- (#!) 是一個(gè)約定的標(biāo)記,它告訴系統(tǒng)這個(gè)腳本需要什么解釋器來(lái)執(zhí)行,即使用哪一種 Shell。
- echo 命令用于向窗口輸出文本。
- ./test.sh 告訴系統(tǒng)在當(dāng)前目錄找命令。
- 作為解釋器參數(shù)
/bin/sh test.sh
/bin/php test.php
shell 定義變量
- 定義變量
- 變量名和等號(hào)之間不能有空格。
- 命名只能使用英文字母、數(shù)字、下劃線,首字母不能以數(shù)字開(kāi)頭
- 中間不能使用空格可以是用下劃線
- 不能使用標(biāo)點(diǎn)符號(hào)
- 不能是用 bash 里的關(guān)鍵字(可以是用 help 查看保留關(guān)鍵字)
name="Mr.Right"
- 使用變量
- 變量名外面的花括號(hào)是可選的,為了幫助解釋器識(shí)別變量的邊界
- readonly 只讀變量
- unset 刪除變量
- 類型
- 局部變量 在腳本或者命令中定義,僅當(dāng)前的 shell 有效。
- 環(huán)境變量 所有程序,包括 shell 啟動(dòng)程序,都能訪問(wèn)環(huán)境變量,有些程序需要環(huán)境變量來(lái)辦證正常運(yùn)行。必要的時(shí)候shell 腳本也可以定義環(huán)境變量。
- shell 變量 是由 shell 程序設(shè)置的特殊變量。shell 變量中有一部分是環(huán)境變量,有一部分是局部變量,這些變量保證了 shell 的正常運(yùn)行。
name="Mr.Right"
echo $name
echo ${name}
readonly name
shell 字符串
- 單引號(hào)
- 單引號(hào)里的任何字符都會(huì)原樣輸出,單引號(hào)字符串中的變量無(wú)效的。
- 單引號(hào)字符串中不能出現(xiàn)單引號(hào)(對(duì)單引號(hào)使用轉(zhuǎn)義后也不行)。
- 雙引號(hào)
- 雙引號(hào)里可以有變量
- 雙引號(hào)可以實(shí)現(xiàn)轉(zhuǎn)義字符
#字符串拼接
name="zhangsan"
jack="hello, "$name" !"
love="hello, ${name} !"
echo ${#name} #輸出4(獲取字符串長(zhǎng)度)
#提取字符串
str="I can't Carray"
echo ${str:0:5} # 輸出 I can
#查找子字符串
echo `expr index "$str" Carray` # 輸出8
數(shù)組
- 在 shell 中用括號(hào)來(lái)表示數(shù)組,數(shù)組元素用空格割開(kāi);
#定義數(shù)組
arr=(v0 v1 v2 v3)
#讀取數(shù)組
${arr[0]} # v0
#獲取數(shù)組的長(zhǎng)度
length=${#arr[@]} # @、*元素的個(gè)數(shù) n 單個(gè)元素的長(zhǎng)度
shell 傳遞參數(shù)
echo "shell 傳遞參數(shù)實(shí)例!";
echo "執(zhí)行的文件名:$0";
echo "第一個(gè)參數(shù): $1";
echo "第二個(gè)參數(shù): $2";
echo "第三個(gè)參數(shù): $3";
$ ./test.sh 1 2 3
$# 傳遞到腳本的參數(shù)個(gè)數(shù)
$* 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)。如"$*"用「"」括起來(lái)的情況、以"$1 $2 … $n"的形式輸出所有參數(shù)。
$$ 腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)
$! 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$@ 與$*相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)。如"$@"用「"」括起來(lái)的情況、以"$1" "$2" … "$n" 的形式輸出所有參數(shù)。
$- 顯示Shell使用的當(dāng)前選項(xiàng),與set命令功能相同。
$? 顯示最后命令的退出狀態(tài)。0表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤。
- $* 與 $@ 區(qū)別:
- 都是引用參數(shù)
- 不同點(diǎn):只有在雙引號(hào)中體現(xiàn)出來(lái)。假設(shè)在腳本運(yùn)行時(shí)寫了三個(gè)參數(shù) 1、2、3,,則 " * " 等價(jià)于 "1 2 3"(傳遞了一個(gè)參數(shù)),而 "@" 等價(jià)于 "1" "2" "3"(傳遞了三個(gè)參數(shù))。
shell 運(yùn)算符
下表列出了常用的算術(shù)運(yùn)算符,假定變量 a 為 10,變量 b 為 20:
# 算術(shù)運(yùn)算符
運(yùn)算符 說(shuō)明 舉例
+ 加法 `expr $a + $b` 結(jié)果為 30。
- 減法 `expr $a - $b` 結(jié)果為 -10。
* 乘法 `expr $a \* $b` 結(jié)果為 200。
/ 除法 `expr $b / $a` 結(jié)果為 2。
% 取余 `expr $b % $a` 結(jié)果為 0。
= 賦值 a=$b 將把變量 b 的值賦給 a。
== 相等。用于比較兩個(gè)數(shù)字,相同則返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比較兩個(gè)數(shù)字,不相同則返回 true。 [ $a != $b ] 返回 true。
#關(guān)系運(yùn)算符
-eq 檢測(cè)兩個(gè)數(shù)是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 檢測(cè)兩個(gè)數(shù)是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 檢測(cè)左邊的數(shù)是否大于右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。
-lt 檢測(cè)左邊的數(shù)是否小于右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。
-ge 檢測(cè)左邊的數(shù)是否大于等于右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。
-le 檢測(cè)左邊的數(shù)是否小于等于右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。
#布爾運(yùn)算符
! 非運(yùn)算,表達(dá)式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
-o 或運(yùn)算,有一個(gè)表達(dá)式為 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 與運(yùn)算,兩個(gè)表達(dá)式都為 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
#邏輯運(yùn)算符
&& 邏輯的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 邏輯的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
#字符串運(yùn)算符
= 檢測(cè)兩個(gè)字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 檢測(cè)兩個(gè)字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 檢測(cè)字符串長(zhǎng)度是否為0,為0返回 true。 [ -z $a ] 返回 false。
-n 檢測(cè)字符串長(zhǎng)度是否為0,不為0返回 true。 [ -n $a ] 返回 true。
str 檢測(cè)字符串是否為空,不為空返回 true。 [ $a ] 返回 true。
#文本測(cè)試運(yùn)算符
-b file 檢測(cè)文件是否是塊設(shè)備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測(cè)文件是否是字符設(shè)備文件,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測(cè)文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測(cè)文件是否是普通文件(既不是目錄,也不是設(shè)備文件),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測(cè)文件是否設(shè)置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測(cè)文件是否設(shè)置了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
-p file 檢測(cè)文件是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測(cè)文件是否設(shè)置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測(cè)文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file 檢測(cè)文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file 檢測(cè)文件是否可執(zhí)行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測(cè)文件是否為空(文件大小是否大于0),不為空返回 true。 [ -s $file ] 返回 true。
-e file 檢測(cè)文件(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。
Shell echo 命令
#顯示普通字符串
echo "it is a test"
#顯示轉(zhuǎn)義字符
echo "\"it is a test\""
#顯示變量
read name
echo "$name it is a test"
#顯示換行
echo -e "OK! \n" #-e 開(kāi)啟轉(zhuǎn)義
echo "it is a test"
echo -e "OK! \c" #-e 開(kāi)啟轉(zhuǎn)義 \c 不換行
#顯示結(jié)果定向至文件
echo "it is a test" > myfile
#輸出原樣字符串用單引號(hào)
echo '$name\"'
#顯示命令執(zhí)行結(jié)果 `
echo `date`
shell printf 命令
- printf 命令模仿 C 程序庫(kù)(library)里的 printf() 程序。
- printf 由 POSIX 標(biāo)準(zhǔn)所定義,因此使用 printf 的腳本比使用 echo 移植性好。
- printf 使用引用文本或空格分隔的參數(shù),外面可以在 printf 中使用格式化字符串,還可以制定字符串的寬度、左右對(duì)齊方式等。
- 默認(rèn) printf 不會(huì)像 echo 自動(dòng)添加換行符,我們可以手動(dòng)添加 \n。
# printf 命令語(yǔ)法
print format-string [arguments...]
# format-string : 為格式控制字符串
# arguments : 為參數(shù)列表
echo "hello, shell"
printf "hello, shell\n"
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 楊過(guò) 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
姓名 性別 體重kg
郭靖 男 66.12
楊過(guò) 男 48.65
郭芙 女 47.99
- %s %c %d %f都是格式替代符
- %-10s 指一個(gè)寬度為10個(gè)字符(-表示左對(duì)齊,沒(méi)有則表示右對(duì)齊),任何字符都會(huì)被顯示在10個(gè)字符寬的字符內(nèi),如果不足則自動(dòng)以空格填充,超過(guò)也會(huì)將內(nèi)容全部顯示出來(lái)。
- %-4.2f 指格式化為小數(shù),其中.2指保留2位小數(shù)。
# format-string為雙引號(hào)
printf "%d %s\n" 1 "abc"
# 單引號(hào)與雙引號(hào)效果一樣
printf '%d %s\n' 1 "abc"
# 沒(méi)有引號(hào)也可以輸出
printf %s abcdef
# 格式只指定了一個(gè)參數(shù),但多出的參數(shù)仍然會(huì)按照該格式輸出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 如果沒(méi)有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"
# 輸出結(jié)果
1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j
and 0
# printf 的轉(zhuǎn)義序列
\a 警告字符,通常為ASCII的BEL字符
\b 后退
\c 抑制(不顯示)輸出結(jié)果中任何結(jié)尾的換行字符(只在%b格式指示符控制下的參數(shù)字符串中有效),而且,任何留在參數(shù)里的字符、任何接下來(lái)的參數(shù)以及任何留在格式字符串中的字符,都被忽略
\f 換頁(yè)(formfeed)
\n 換行
\r 回車(Carriage return)
\t 水平制表符
\v 垂直制表符
\\ 一個(gè)字面上的反斜杠字符
\ddd 表示1到3位數(shù)八進(jìn)制值的字符。僅在格式字符串中有效
\0ddd 表示1到3位的八進(jìn)制值字符
shell test 命令
- 數(shù)值測(cè)試
# 數(shù)值測(cè)試
-eq 等于則為真
-ne 不等于則為真
-gt 大于則為真
-ge 大于等于則為真
-lt 小于則為真
-le 小于等于則為真
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '兩個(gè)數(shù)相等!'
else
echo '兩個(gè)數(shù)不相等!'
fi
# 輸出結(jié)果:
兩個(gè)數(shù)相等!
- 字符串測(cè)試
# 字符串測(cè)試
= 等于則為真
!= 不相等則為真
-z 字符串 字符串的長(zhǎng)度為零則為真
-n 字符串 字符串的長(zhǎng)度不為零則為真
num1="Mr.Right"
num2="Mr.Chen"
if test $num1 = $num2
then
echo '兩個(gè)字符串相等!'
else
echo '兩個(gè)字符串不相等!'
fi
#輸出結(jié)果
兩個(gè)字符串不相等!
- 文件測(cè)試
-e 文件名 如果文件存在則為真
-r 文件名 如果文件存在且可讀則為真
-w 文件名 如果文件存在且可寫則為真
-x 文件名 如果文件存在且可執(zhí)行則為真
-s 文件名 如果文件存在且至少有一個(gè)字符則為真
-d 文件名 如果文件存在且為目錄則為真
-f 文件名 如果文件存在且為普通文件則為真
-c 文件名 如果文件存在且為字符型特殊文件則為真
-b 文件名 如果文件存在且為塊特殊文件則為真
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
#輸出結(jié)果
文件已存在!
- Shell還提供了與( -a )、或( -o )、非( ! )三個(gè)邏輯操作符用于將測(cè)試條件連接起來(lái),其優(yōu)先級(jí)為:"!"最高,"-a"次之,"-o"最低。例如:
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '至少有一個(gè)文件存在!'
else
echo '兩個(gè)文件都不存在'
fi
#輸出結(jié)果
至少有一個(gè)文件存在!
shell 流程控制
- if else if
# if 語(yǔ)法
if condition
then
command1
....
commandN
fi
#寫成一行(適用于直接在終端使用)
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
# if else
if condition
then
command1
....
commandN
else
command
fi
# if else - if else
if condition1
then
command1
....
commandN
elif comdition2
then
command2
else
command3
fi
a=10
b=20
if [$a == $b]
then
echo 'a 等于 b'
elif [$a -gt $b]
then
echo 'a 大于 b'
elif [$a -lt $b]
then
echo 'a 小于 b'
else
echo '沒(méi)有符合條件'
fi
#輸出結(jié)果
a 小于 b
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '兩個(gè)數(shù)字相等'
else
echo '兩個(gè)數(shù)字不相等'
fi
- for 循環(huán)
- 當(dāng)變量值在列表里,for循環(huán)即執(zhí)行一次所有命令,使用變量名獲取列表中的當(dāng)前取值。命令可為任何有效的shell命令和語(yǔ)句。in列表可以包含替換、字符串和文件名。
- in列表是可選的,如果不用它,for循環(huán)使用命令行的位置參數(shù)。
for var in item1 item2 ... itemN
do
command
done
或者
for var in item1 item2 ... itemN; do command1; command2… done;
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
#輸出結(jié)果
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
for str in 'This is a string'
do
echo $str
done
#輸出結(jié)果
This is a string
- while 語(yǔ)句
- while循環(huán)用于不斷執(zhí)行一系列命令,也用于從輸入文件中讀取數(shù)據(jù);命令通常為測(cè)試條件。
while condition
do
command
done
#!/bin/bash
int=1
while(( $int<5 ))
do
echo $int
let "int++"
done
#輸出結(jié)果
1
2
3
4
# 用于讀取鍵盤信息
echo '按下 Ctrl-d 退出'
echo -n '輸入你最喜歡的網(wǎng)站'
while read FILM
do
#statements
echo " 是的!$FILM 是一個(gè)好網(wǎng)站"
done
#輸出結(jié)果
是的!www.baidu.com 是一個(gè)好網(wǎng)站
#無(wú)限循環(huán)
while :
do
command
done
或者
while true
do
command
done
或者
for (( ; ; ))
- until 循環(huán)
- until 循環(huán)執(zhí)行一系列命令直至條件為真時(shí)停止
- until 循環(huán)和 while 循環(huán)在處理方式上正好相反
- 一般 while 循環(huán)優(yōu)于 until 循環(huán),在某些情況下 until 更加有用
until comdition
do
command
done
- case
- shell case 語(yǔ)句為多選擇語(yǔ)句??梢杂?case 語(yǔ)句匹配一個(gè)值與一個(gè)模式,如果匹配成功,執(zhí)行匹配的命令。
- case工作方式如上所示。取值后面必須為單詞in,每一模式必須以右括號(hào)結(jié)束。取值可以為變量或常數(shù)。匹配發(fā)現(xiàn)取值符合某一模式后,其間所有命令開(kāi)始執(zhí)行直至 ;;。
- 取值將檢測(cè)匹配的每一個(gè)模式。一旦模式匹配,則執(zhí)行完匹配模式相應(yīng)命令后不再繼續(xù)其他模式。如果無(wú)一匹配模式,使用星號(hào) * 捕獲該值,再執(zhí)行后面的命令。
case 值 in
模式1)
command1
...
;;
模式2)
command2
...
;;
esac
echo '輸入 1 到 4 之間的數(shù)字'
echo '你輸入的數(shù)字為:'
read aNum
case $aNum in
1 ) echo '你選擇了1'
;;
2 ) echo '你選擇了2'
;;
3 ) echo '你選擇了3'
;;
4 ) echo '你選擇了4'
;;
* ) echo '你沒(méi)有輸入1-4之間的數(shù)字'
;;
esac
#輸出結(jié)果
輸入 1 到 4 之間的數(shù)字:
你輸入的數(shù)字為:
3
你選擇了 3
-
跳出循環(huán)
- breark 命令(終止后面的所有循環(huán))
while : do echo -n "輸入 1 到 5 之間的數(shù)字:" read aNum case $aNum in 1|2|3|4|5) echo "你輸入的數(shù)字為 $aNum!" ;; *) echo "你輸入的數(shù)字不是 1 到 5 之間的! 游戲結(jié)束" break ;; esac done- continue 僅跳出當(dāng)前循環(huán)
while : do echo -n "輸入 1 到 5 之間的數(shù)字: " read aNum case $aNum in 1|2|3|4|5) echo "你輸入的數(shù)字為 $aNum!" ;; *) echo "你輸入的數(shù)字不是 1 到 5 之間的!" continue echo "游戲結(jié)束" ;; esac done- case的語(yǔ)法和C family語(yǔ)言差別很大,它需要一個(gè)esac(就是case反過(guò)來(lái))作為結(jié)束標(biāo)記,每個(gè)case分支用右圓括號(hào),用兩個(gè)分號(hào)表示break。
Shell 函數(shù)
[ function ] funcname [()]
{
action;
[return int;]
}
1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數(shù)。
2、參數(shù)返回,可以顯示加:return 返回,如果不加,將以最后一條命令運(yùn)行結(jié)果,作為返回值。 return后跟數(shù)值n(0-255)
domeFun() {
echo '這是我的第一個(gè)shell函數(shù)'
}
echo '函數(shù)開(kāi)始執(zhí)行'
domeFun
echo '函數(shù)執(zhí)行完畢'
- 函數(shù)返回值在調(diào)用該函數(shù)后通過(guò) $? 來(lái)獲得。
domeFun() {
echo '這是我的第一個(gè)shell函數(shù)'
echo '輸入第一個(gè)數(shù)字'
read aNum
echo '輸入第二個(gè)數(shù)字'
read bNum
echo '兩個(gè)數(shù)字分別為 $aNum 和 $bNum'
return $(($aNum+$bNum))
}
echo '函數(shù)開(kāi)始執(zhí)行'
domeFun
echo "輸出兩個(gè)數(shù)字的和為 $? !"
echo '函數(shù)執(zhí)行完畢'
- 在Shell中,調(diào)用函數(shù)時(shí)可以向其傳遞參數(shù)。在函數(shù)體內(nèi)部,通過(guò) $n 的形式來(lái)獲取參數(shù)的值,例如,$1表示第一個(gè)參數(shù),$2表示第二個(gè)參數(shù)...
- 注意,$10 不能獲取第十個(gè)參數(shù),獲取第十個(gè)參數(shù)需要${10}。當(dāng)n>=10時(shí),需要使用${n}來(lái)獲取參數(shù)。
domeFun() {
echo '這是我的第一個(gè)shell函數(shù)'
echo '兩個(gè)數(shù)字分別為 $1 和 $2 '
return $(($1+$2))
}
echo '函數(shù)開(kāi)始執(zhí)行'
domeFun 1 3
echo "輸出兩個(gè)數(shù)字的和為 $? !"
echo '函數(shù)執(zhí)行完畢'
#執(zhí)行結(jié)果
函數(shù)開(kāi)始執(zhí)行
這是我的第一個(gè)shell函數(shù)
兩個(gè)數(shù)字分別為 $1 和 $2
輸出兩個(gè)數(shù)字的和為 4 !
函數(shù)執(zhí)行完畢
#參數(shù)說(shuō)明
$# 傳遞到腳本的參數(shù)個(gè)數(shù)
$* 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)
$$ 腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)
$! 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$@ 與$*相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)。
$- 顯示Shell使用的當(dāng)前選項(xiàng),與set命令功能相同。
$? 顯示最后命令的退出狀態(tài)。0表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤。
shell 輸入、輸出重定向
- 大多數(shù) UNIX 系統(tǒng)命令從你的終端接受輸入并將所產(chǎn)生的輸出發(fā)送回??到您的終端。一個(gè)命令通常從一個(gè)叫標(biāo)準(zhǔn)輸入的地方讀取輸入,默認(rèn)情況下,這恰好是你的終端。同樣,一個(gè)命令通常將其輸出寫入到標(biāo)準(zhǔn)輸出,默認(rèn)情況下,這也是你的終端。
- 需要注意的是文件描述符 0 通常是標(biāo)準(zhǔn)輸入(STDIN),1 是標(biāo)準(zhǔn)輸出(STDOUT),2 是標(biāo)準(zhǔn)錯(cuò)誤輸出(STDERR)。
命令 說(shuō)明
command > file 將輸出重定向到 file。
command < file 將輸入重定向到 file。
command >> file 將輸出以追加的方式重定向到 file。
n > file 將文件描述符為 n 的文件重定向到 file。
n >> file 將文件描述符為 n 的文件以追加的方式重定向到 file。
n >& m 將輸出文件 m 和 n 合并。
n <& m 將輸入文件 m 和 n 合并。
<< tag 將開(kāi)始標(biāo)記 tag 和結(jié)束標(biāo)記 tag 之間的內(nèi)容作為輸入。
-
輸出重定向
command1 > file1- 上面這個(gè)命令執(zhí)行command1然后將輸出的內(nèi)容存入file1。
- 執(zhí)行下面的 who 命令,它將命令的完整的輸出重定向在用戶文件中(users):
who > users- 執(zhí)行 cat 命令查看
? cat users chenzhou console Mar 19 09:37 chenzhou ttys154 Mar 22 18:41

重定向.png
-
輸入重定向
- 本來(lái)需要從鍵盤獲取輸入的命令會(huì)轉(zhuǎn)移到文件讀取內(nèi)容。
- 注意:輸出重定向是大于號(hào)(>),輸入重定向是小于號(hào)(<)。
command1 < file1- 接著以上實(shí)例,我們需要統(tǒng)計(jì) users 文件的行數(shù),執(zhí)行以下命令:
$ wc -l users 2 users # 也可以輸入重定向到 users $ wc -l < users 2- 注意:上面兩個(gè)例子的結(jié)果不同:第一個(gè)例子,會(huì)輸出文件名;第二個(gè)不會(huì),因?yàn)樗鼉H僅知道從標(biāo)準(zhǔn)輸入讀取內(nèi)容。
command1 < infile > outfile- 同時(shí)替換輸入和輸出,執(zhí)行command1,從文件infile讀取內(nèi)容,然后將輸出寫入到outfile中。
-
重定向深入講解
- 一般情況下,每個(gè) Unix/Linux 命令運(yùn)行時(shí)都會(huì)打開(kāi)三個(gè)文件:
- 標(biāo)準(zhǔn)輸入文件(stdin):stdin的文件描述符為0,Unix程序默認(rèn)從stdin讀取數(shù)據(jù)。
- 標(biāo)準(zhǔn)輸出文件(stdout):stdout 的文件描述符為1,Unix程序默認(rèn)向stdout輸出數(shù)據(jù)。
- 標(biāo)準(zhǔn)錯(cuò)誤文件(stderr):stderr的文件描述符為2,Unix程序會(huì)向stderr流中寫入錯(cuò)誤信息。
- 默認(rèn)情況下,command > file 將 stdout 重定向到 file,command < file 將stdin 重定向到 file。
# 如果希望 stderr 重定向到 file,可以這樣寫: $ command 2 > file # 如果希望 stderr 追加到 file 文件末尾,可以這樣寫 $ command 2 >> file # 2 表示標(biāo)準(zhǔn)錯(cuò)誤文件(stderr)。 # 如果希望將 stdout 和 stderr 合并后重定向到 file,可以這樣寫: $ command > file 2>&1 或者 $ command >> file 2>&1 # 如果希望對(duì) stdin 和 stdout 都重定向,可以這樣寫 $ command < file1 >file2 # command 命令將 stdin 重定向到 file1,將 stdout 重定向到 file2。 - 一般情況下,每個(gè) Unix/Linux 命令運(yùn)行時(shí)都會(huì)打開(kāi)三個(gè)文件:
-
Here Document 是 Shell 中的一種特殊的重定向方式,用來(lái)將輸入重定向到一個(gè)交互式 Shell 腳本或程序。
- 它的作用是將兩個(gè) delimiter 之間的內(nèi)容(document) 作為輸入傳遞給 command。
- 結(jié)尾的delimiter 一定要頂格寫,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 縮進(jìn)。
- 開(kāi)始的delimiter前后的空格會(huì)被忽略掉。
command << delimiter document delimiter# 使用 wc -l 計(jì)算 Here Document 的行數(shù) wc -l << EOF 歡迎使用百度 www.baidu.com EOF #執(zhí)行結(jié)果 ./test.sh 2 cat << EOF 歡迎使用百度 www.baidu.com EOF #執(zhí)行結(jié)果 ./test.sh 歡迎使用百度 www.baidu.com -
/dev/null 文件
- 如果希望執(zhí)行某個(gè)命令,但又不希望在屏幕上顯示輸出結(jié)果,那么可以將輸出重定向到 /dev/null:
- /dev/null 是一個(gè)特殊的文件,寫入到它的內(nèi)容都會(huì)被丟棄;如果嘗試從該文件讀取內(nèi)容,那么什么也讀不到。但是 /dev/null 文件非常有用,將命令的輸出重定向到它,會(huì)起到"禁止輸出"的效果。
```
$ command > /dev/null
```
* 如果希望屏蔽 stdout 和 stderr,可以這樣寫:
```
$ command > /dev/null 2>&1
```
* 注意:0 是標(biāo)準(zhǔn)輸入(STDIN),1 是標(biāo)準(zhǔn)輸出(STDOUT),2 是標(biāo)準(zhǔn)錯(cuò)誤輸出(STDERR)。
shell 文件包含
和其他語(yǔ)言一樣,Shell 也可以包含外部腳本。這樣可以很方便的封裝一些公用的代碼作為一個(gè)獨(dú)立的文件。
Shell 文件包含的語(yǔ)法格式如下:
. filename # 注意點(diǎn)號(hào)(.)和文件名中間有一空格
或
source filename
#test1.sh
#!/bin/bash
url="http://www.baidu.com"
echo $url
# test.sh
. ./test1.sh
-
被包含的文件 test1.sh 不需要可執(zhí)行權(quán)限。
執(zhí)行文件.png
