SHELL
一 什么是 Shell
shell 直譯為殼,shell 是一個命令解釋器,處于內(nèi)核和用戶之間,負責(zé)把用戶的指令傳遞給內(nèi)核并將執(zhí)行結(jié)果回顯給用戶,同時 shell 也是一門編程語言。
shell 之所以被稱為 shell ,是因為它隱藏了操作系統(tǒng)的底層細節(jié)。Unix 下的一些圖形用戶界面如 GNONE 、KDE... 也被稱為是 “虛擬 shell”
二 常見的幾種 shell
- Bourne Shell (sh):它是 Unix 的默認 shell,也是其它 shell 的開發(fā)基礎(chǔ),但是在交互方面不如其它 shell,sh 的創(chuàng)始人是 Steven Bourne,為了紀念他也是以他的名字來命令
- C Shell(csh):csh 的語法和 C 語言很類似,在交互方面有了很大的改善如:命令不全,命令別名等,但是 csh 和 sh 不兼容
- Korn Shell(ksh):是 csh 的一個加強版,集合了 csh 和 sh 的優(yōu)點,并且兼容 sh
- Bourne Again Shell (bash):是自由軟件基金會(GNU)開發(fā)的一個Shell,它是Linux系統(tǒng)中一個默認的Shell。Bash不但與Bourne Shell兼容,還繼承了C Shell、Korn Shell等優(yōu)點。
- Zsh:在兼容 bash 的同時提供了更多的改進
三 常用功能
- 歷史命令
- 查看歷史記錄
history // 查詢歷史記錄,顯示最近使用的2000條命令(默認兩千)
- 修改顯示記錄數(shù)
vi /etc/profile //修改環(huán)境變量配置文件
HISTSIZE=1000 //修改默認歷史命令條數(shù)
source /etc/profile 使環(huán)境變量生效
- 把內(nèi)存中的命令歷史保存到文件中(歷史默認保存在
~/.bash_history
文件中)
打開 terminal 后,我們在沒有關(guān)閉 terminal 前,在當前 terminal 的操作命令會保存在內(nèi)存中,直到當前 terminal 關(guān)閉后,內(nèi)存中的命令歷史才會被寫入到~/.bash_history
文件中。
如果我們需要強制將內(nèi)存中的命令歷史保存在~/.bash_history
文件中,使用
history -w //把內(nèi)存中命令歷史,保存入文件
- 清空歷史
history -c
- 重復(fù)歷史命令
!n //重復(fù)第n條命令
!str //重復(fù)最后一個以str開頭的命令
上箭頭 //調(diào)用上面的命令
- 別名
- 查看系統(tǒng)中已有的別名
alias
- 設(shè)置別名
alias ls='ls --color=never' 手工設(shè)定別名,臨時生效
vi ~/.bashrc 在 ~/.bashrc 寫入別名,永久生效
-
輸出重定向
即把輸出在屏幕上的信息重定向到文件中(比如 log 信息)
> 覆蓋
ls > aa 將 ls 命令顯示的信息覆蓋到 aa 文件中
>> 追加
ls >> aa 將 ls 命令顯示的信息追加到 aa 文件中
ls gdlslga 2>>aa 將錯誤信息輸出到 aa 文件中(ls gdlsga 命令會出錯)
ls >> aa 2>>bb 將正確信息輸出到 aa 文件中,錯誤信息輸出到 bb 中
ls >> aa 2>&1 將正確和錯誤信息都追加在 aa 中
- 多命令順序執(zhí)行
-
命令1 ; 命令2 ; 命令3
//命令123順序執(zhí)行。之間沒有任何關(guān)系 -
命令1 && 命令2
//命令1正確執(zhí)行后,命令2才會執(zhí)行 -
命令1 || 命令2
//命令1執(zhí)行不正確,命令2才會執(zhí)行
- 管道符
命令1 | 命令2
//命令1的執(zhí)行結(jié)果,作為命令2的執(zhí)行條件
netstat -tlun | grep 80 查詢監(jiān)聽的端口號,并查看80端口是否啟動。
- 鍵盤讀取
read -p “提示信息” [-t 等待時間] 變量名
# example.sh #
#!/bin/bash
read -p "please input num1:" -t 30 test1
read -p "input num2:" -t 30 test2
sum=$(( $test1 + $test2))
echo “num1 + num2 = $sum”
-
數(shù)值運算
變量默認是字符串類型,進行數(shù)值運算可有下面三種方法
num1=123
num2=456
1 declare -i sum=$num1+$num2
2 sum=$(( $num1 + $num2 ))
3 sum=$(expr $num1 + $num2) 注意+左右必須空格
支持的運算操作 + - \* / %取余
四 變量
變量設(shè)定規(guī)則
- 變量以等號連接值,等號不能有空格
- 變量名由數(shù)字和字母和下劃線組成,不能以數(shù)字開頭
- 變量值中有空格,用引號括起來
- 雙引號內(nèi),有特殊字符。如$
- 單引號中特殊字符無含義
- 在變量值中,可以使用\轉(zhuǎn)義符
- 變量值可以直接調(diào)用系統(tǒng)命令。 `命令` $(命令)
- 變量值可以累加 aa=123 aa="$aa"456 echo $aa --->123456
- 環(huán)境變量一定設(shè)為大寫
- 本地變量
- 聲明
變量名=變量值 注意:=號左右不能有空格
aa=123
- 調(diào)用
echo $aa
- 查看變量
set 查看所有變量,包括環(huán)境變量和本地變量
- 刪除
unset 變量名
- 環(huán)境變量
- 聲明
export 變量名=變量值
- 查看
set 查看所有變量
env、export 只查看環(huán)境變量
- 聲明變量類型
declare 聲明變量類型的,如果不特別聲明,所有變量為字符串型
-i 聲明為int
-x 聲明為環(huán)境變量
- 刪除
unset 變量名
- 環(huán)境變量配置文件
/etc/profile
/etc/bashrc 所有用戶生效
~/.bashrc
~/.bash_profile 只對指定用戶生效
-
位置參數(shù)變量
在執(zhí)行 shell 腳本時手動傳入?yún)?shù)
eg:
sh example.sh a b
# example.sh #
#!/bin/bash
echo "the command is $0" // $0 代表命令自己
echo "param1 is $1" // $1 代表第一個參數(shù)即 a
echo "param2 is $2" // $2 代表第一個參數(shù)即 b
五 常用命令
- 行提取命令 grep
選項:
-v 反向
-n 顯示行號
grep “\.$” test.txt -n // 匹配以 . 結(jié)尾的行并顯示行號
- 列提取命令 cut
cut -d “分隔符” -f 提取列 文件名
more /etc/passwd | grep "/bin/bash" | cut -d ":" -f 1,3
提取passwd文件中可以登錄的用戶的用戶名和UID
六 條件判斷
格式
test 測試條件 測試內(nèi)容
或
[ 測試條件 測試內(nèi)容 ] // [] 中必須有空格
- 測試文件類型
test -e 文件名 測試文件是否存在,存在為真
test -f 文件名 判斷是否是普通文件
test -d 文件名 判斷是否為目錄
test -b 文件名 判斷是否為塊設(shè)備文件
test -c 文件名 字符設(shè)備文件
- 測試文件權(quán)限
test -r 文件名 判斷是否有可讀權(quán)限
test -w 文件名 可寫
test -x 文件名 執(zhí)行
test -s 文件名 判斷是否為非空白,有內(nèi)容為真
- 兩個文檔比較
[ file1 -nt file2 ] file1是否比file2新
[ file1 -ot file2 ] file1是否比file2舊
[ file1 -ef file2 ] file1與file2是否是鏈接文件
- 兩個數(shù)值之間判斷
[ n1 -eq n2 ] n1和n2是否相等
[ n1 -ne n2 ] n1和n2是否不等
[ n1 -gt n2 ] n1大于n2
[ n1 -lt n2 ] n1小于n2
[ n1 -ge n2 ] n1大于等于n2
[ n1 -le n2 ] n1小于等于n2
- 判斷字符串
[ -z 字符串 ] 判斷字符串是否為空
[ 字符串1 == 字符串2 ] 判斷字串1 是否與字串2相等
[ 字符串1 != 字符串2 ] 判斷字串是否不等
- 多重判斷
-a 邏輯與
[ -z $file -a -e $file ]
-o 邏輯或
! 邏輯非
七 流程控制
- if 語句
- 單分支
if 條件測試命令
then 命令序列
fi
- 雙分支
if 條件測試命令
then 命令序列1
else 命令序列2
fi
- 多分支
if 條件測試命令1 ; then
命令序列1
elif 條件測試命令2 ; then
命令序列2
elif ...
else
命令序列n
fi
- for 語句
- 使用in關(guān)鍵字循環(huán)
for 變量名 in 取值列表
do
命令序列
done
eg:
for time in morning noon afternoon evening
do
echo $time
done
files=$(ls) //遍歷 ls 的結(jié)果
for time in $files
do
echo $time
done
- 數(shù)值加加循環(huán)
s=0
for ((i=1;i<=100;i=i+1))
do
s=$(($s+$i))
done
- while循環(huán)語句
while 命令或表達式
do
命令列表
done