幫助文檔打開
- man
shang$ man ls
- --help
shang$ ls --help
- whatis
shang$ whatis ls
重定向
I/O重定向可以重新定義標準輸出內容發(fā)送到哪里。
- 重定向操作符“>”,把標準輸出定向到一個新的文件。當出現(xiàn)錯誤時,ls 程序不會把錯誤信息發(fā)送到標準輸出文件中,會把錯誤信息發(fā)送到標準錯誤文件。
- 重定向符“>>”,將輸出內容添加到文件末尾,若文件不存在,會創(chuàng)建一個。
- 標準錯誤輸出。
標準輸入文件 0>;
標準輸出文件 1>;
標準錯誤文件 2>;
shang$ ls -l /bin/usr 2> ls-error.txt
#錯誤和輸出都放到文件中
shang$ ls -l /bin/usr > ls-output.txt 2>&1
#同上
shang$ ls -l /bin/usr &> ls-output.txt
- /dev/null 。 bit bucket
- 標準輸入重定向
cat :讀取一個或多個文件,并復制到標準輸出文件中。
“<” 重定向符,將標準輸入的鍵盤源,改變?yōu)?符號后面的文件
shang$ cat < lazy_dog.txt
This is a lazy dog.
- 管道
命令從標準輸入到讀取數(shù)據(jù),并將數(shù)據(jù)發(fā)送到標準輸出的能力,是使用了名為管道的shell 特性。使用管道操作符 “|” 可以把一個命令的標準輸出傳送到另一個命令的標準輸入中。
# less 命令可以分頁顯示任意命令的輸入,將它的結果發(fā)送到標準輸出。
shang$ ls -l/usr/bin | less
# 將 usr/bin 和 /bin 文件下所有的可執(zhí)行程序合并成一個列表,安裝順序排序,最后查看這個吧列表。
shang$ ls -l/usr/bin /bin |sort | less
- wc
統(tǒng)計文件中包含的 行數(shù),字數(shù) ,字節(jié)數(shù)。
8.部分打印
shang$ head -n 5 ls-output.txt
shang$ tail -n 5 ls-output.txt
- $ cd
dirname $0和PWD%/* shell變量的一些特殊用法
在命令行狀態(tài)下單純執(zhí)行 $ cddirname $0是毫無意義的。因為他返回當前路徑的"."。
這個命令寫在腳本文件里才有作用,他返回這個腳本文件放置的目錄,并可以根據(jù)這個目錄來定位所要運行程序的相對位置(絕對位置除外)。
在/home/admin/test/下新建test.sh內容如下:
cd `dirname $0`
echo `pwd`
然后返回到/home/admin/執(zhí)行
shang$ sh test/test.sh
運行結果:
/home/admin/test
這樣就可以知道一些和腳本一起部署的文件的位置了,只要知道相對位置就可以根據(jù)這個目錄來定位,而可以不用關心絕對位置。這樣腳本的可移植性就提高了,扔到任何一臺服務器,(如果是部署腳本)都可以執(zhí)行。
BASH使用基礎
關于命令及命令類型
對于使用的命令BASH使用hash表,以加速下次的查找,為添加一個經(jīng)常使用的命令,可以使用hash cmd
BASH在執(zhí)行命令時對路徑中找到的同名命令按以下的類型順序執(zhí)行:別名 keywords 函數(shù) 內置命令 可執(zhí)行文件或腳本
BASH在執(zhí)行用戶輸入的一條指令時,首先要判斷命令的類型,可以使用type cmd來查看cmd是類型。
enable命令用來決定是否開啟某個內置的命令,可以用enable -n cmd來禁用某個內置命令。
command命令用來消除別名和函數(shù)的查找。
builtin命令將只查找內置命令,而忽略函數(shù)和可執(zhí)行文件。
作業(yè)控制:jobs %1 fg bg kill stop等
別名:alias dir='dir -l' unalisa dir
操作目錄棧:dirs pushd popd
文件名替換:dir d[1-3] ls .bash{rc,profile} 支持[]對數(shù)字及{}對字符串的集合
變量 變量聲明:declare -a 數(shù)組 -f 函數(shù) -i 整數(shù) -r 只讀 -x 導出變量
本地變量只在其所聲明的shell中有效,只讀變量不能被修改,除非重新聲明其屬性
常見的環(huán)境變量:
BASH_VERSION DIRSTACK EUID EDITOR GROUPS HISTFILE HISTSIZE HOME LANG PWD OLDPWD PATH
PPID PS1-4 RANDOM SHELL UID
export var = value -f 導出的變量為函數(shù) -n 將全局轉為局部變量 -p只打印導出的變量
非只讀變量可以通過unset清除、
變量替換
${var:-word} 如果變量var已經(jīng)設置且非空,結果為var的值,否則結果為word
${var:=word} 如果變量var已經(jīng)設置且非空,結果為var的值,否則設置var為word
${var:+word} 如果變量var已經(jīng)設置且非空,則設置var的值為word;否則不替換
${var:?word} 如果變量var已經(jīng)設置且非空,則替換為word,否則退出shell。
${var:n} 替換為從n開始的子串
${var:n:len} 替換為從n開始長len的子串
變量擴展
${var%pattern} 去掉最小匹配的后綴 echo ${PWD%/} 顯示當前的父目錄路徑
${var%%pattern} 去掉最大匹配的后綴
${var#pattern} 去掉最小匹配的前綴
${var##pattern} 去掉最大匹配的前綴 echo ${PWD##/} 顯示當前目錄名稱
${#var} 替換為變量字符個數(shù)
特殊變量
$ 當前SHELL的PID
? 前一個命令的退出狀態(tài)
! 后臺執(zhí)行的上一個工作的PID
讀取用戶輸入
read 從終端讀取輸入存入內置變量REPLY
read var 從終端讀取輸入存入變量var
read first .. last 從終端讀取多個變量依次存入,若輸入較多,則最后一個變量成為包含多個值的字串
read -a array 從終端讀取多個值存入數(shù)組中
read -p pmtstring var 向終端輸出提示串,然后讀入輸入到var中
read -r line 讀取一行,并允許/
變量類型轉換
如果變量在聲明時沒確定類型,則變量根據(jù)賦值情況可以動態(tài)轉換類型,但如果聲明時變量類型已經(jīng)確定,若賦值為其他類型,將導致原有數(shù)據(jù)丟失或出錯。除非重新聲明類型。
對于整數(shù)類型的變量,則在命令行支持算法擴展,如num=3*4,支持"",不支持空格。
進制
var=16#abc var為16進制數(shù)abc
輸出
printf "The number is %.2f/n" 100
echo -ne "hello/nworld/n" -e 表示需要解析轉義字符,-n 表示不自動添加換行符
位置參數(shù)
$0 1-0 ${10}
$# 求值位置參數(shù)個數(shù)
$* 求值所有位置參數(shù)
"$*"
$@
"$@"
引用
() 命令組,創(chuàng)建子SHELL執(zhí)行
{} 命令組,不創(chuàng)建子SHELL
' ' 保護所有的元字符不被解析,想打印',必須放在雙引號內,或者使用/轉義
" " 只允許變量和命令替換,保護其余的元字符不被解析
命令替換
`cmd`
$(cmd)
二者結果都是一個字符串,如果加"",則保留換行,否則丟失換行。
數(shù)學表達式擴展 $[ exp ]
$(( exp ))
數(shù)組
declare -a array=(item1 item2 ...)
數(shù)組元素的引用 ${array[i]}
引用整個數(shù)組 ${array[*]}
unset array
函數(shù)定義
function f()
{
cmd;cmd;
}
I/O重定向
find . name /*.c print > foundit 2>&1
命令行參數(shù)
set可用來設置位置參數(shù),使用set --將清除所有位置參數(shù)
$與$@的區(qū)別只在于" "時,當$放在""內時,參數(shù)表成為單個字符串,而$@放在""內時,每個參數(shù)都被引號括住。
表達式
評估表達式
expr $[3+4] $[ 3+4 ] $(( 3+4 ))
let算術擴展
let i=i+1 支持任何C類型的運算符,但只支持整形數(shù)運算
bash不支持小數(shù)運行,因此需要在bc或者awk中進行相應的運行,再把結果回。由于bash沒有浮點型,所以小數(shù)是以字符串表示。
測試表達式
測試可以使用test或者單純的[ expr1 cmp expr2],結果保存于?變量中,即test與[]等價
字符串測試
[ str1 = str2 ] str1與str2相同或==
[ str1 != str2 ] st1與str2不相同
[ str ] str非空
[ -z str ] str的長度為0
[ -n str ] str的長度非0
[ -l str ] str的長度
[ str1 -a str2 ] and
-o or
! not
復合條件測試
[[ p1 && p2 ]] p1與p2均為真
[[ p1 || p2 ]]
[[ !p2 ]]
整數(shù)測試
[ num1 -eq num2 ]
[ numb1 -ne num2 ]
gt ge lt le
文件屬性測試
[ file1 nt file2 ] 文件1比文件2新
[ file1 ot file2 ]
[ file1 ef file2 ]
[-d file] file為目錄
-b -c -p -L -S 塊文件,字符文件,管道,鏈接,socket
-e -f 文件存在,常規(guī)文件
-G 文件存在且擁有有效GID
-O 文件存在且擁有有效UID
-g 設置GID
-k 設置stick位
-r -w -x 文件可讀,可寫,可執(zhí)行的
-s 文件大小非0
-t 文件fd在終端打開
-u setUID位設置
測試表達可以與let的運算擴展及(( ))中的C型運算擴展是等價的,后者也許更容易理解,C-like。
條件控制
if command
then
command
command
fi
if test expression
then
command
fi
if [ string/numeric expression ] then
command
fi
if [[ string expression ]] then
command
fi
if (( numeric expression ))
if command
then
command(s)
else
command(s)
fi
if command
then
command(s)
elif command
then
commands(s)
elif command
then
command(s)
else
command(s)
fi
空命令 :
分支跳轉
case variable in
value1)
command(s)
;;
value2)
command(s)
;;
*)
command(s)
;;
esac
循環(huán) for variable in word_list
do
command(s)
done
while condition
do
command(s)
done
until command
do
command(s)
done
構建菜單的select select program in 'ls -F' pwd date
do
$program
done
中斷循環(huán) break [n] 從第n層循環(huán)中跳出
continue [n] 繼續(xù)第n層循環(huán)
捕獲信號
信號列表
- SIGHUP 9) SIGKILL 17) SIGCHLD 25) SIGXFSZ
- SIGINT 10) SIGUSR1 18) SIGCONT 26) SIGVTALRM
- SIGQUIT 11) SIGSEGV 19) SIGSTOP 27) SIGPROF
- SIGILL 12) SIGUSR2 20) SIGTSTP 28) SIGWINCH
- SIGTRAP 13) SIGPIPE 21) SIGTTIN 29) SIGIO
- SIGABRT 14) SIGALRM 22) SIGTTOU 30) SIGPWR
- SIGBUS 15) SIGTERM 23) SIGURG
- SIGFPE 16) SIGSTKFLT 24) SIGXCPU
trap 'command; command' signal-number-list
trap 'command; command' signal-name-list 處理信號,當收到singal-list中的信號后,執(zhí)行 ''中的命令
trap singal 重置信號處理函數(shù)
trap 列出已經(jīng)設置信號處理
調試腳本
bash -x script 顯示命令執(zhí)行過程,及結果
bash -v script 顯示腳本中的各行
bash -n script 解釋但不執(zhí)行
常用命令
script myfile 將終端交互信息保存在myfile中,使用control+d退出
fuser -n tcp 22 獲得打開tcp 22的進程
lsof 獲得進程打開的文件