0 Shell基礎
0.1 Shell是什么
0.1.1 Shell是什么
Shell是一個命令行解釋器,它為用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序,用戶可以用Shell來啟動、掛起、停止甚至編寫一些程序。
硬件 <-內核 <- Shell命令解釋器<-外層應用程序
? ? ? ? ? ? 0101 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ls
?
Shell還是一個功能相當強大的編程語言,易編寫,易調試,靈活性強。
Shell是解釋執行的腳本語言,在Shell中可以直接調用Linux系統命令。
?
0.1.2 Shell的分類
Bourne Shell:從1979年起UNIX就開始使用bourne Shell,bourne Shell的主文件名為sh
C Shell:C Shell主要在BSD版的UNIX系統中使用,其語法和C語言相類似而得名
?
Shell的兩種主要語法類型有Bourne和C,這兩種語法彼此不兼容。
Bourne家族主要包括sh、ksh、Bash、psh、zsh;
C家族主要包括csh、tcsh。
?
Bash:Bash與sh兼容,現在使用的Linux就是使用Bash作為用戶的基本Shell
?
0.1.3 Linux支持的Shell
/etc/shells文件中記錄的是系統支持的shell
sh ??#此命令用于啟動Shell
exit ?#此命令用于退出Shell
?
0.2 Shell腳本的執行方式
0.2.1 echo輸出命令
echo 選項 變量
作用:將變量顯示到標準輸出
選項:
-e 支持反斜線控制的字符轉換
?
\\ 輸出\本身
\a 輸出警告音
\b 退格鍵,向左刪除 ??
\c 取消輸出行末的換行符
\e ESCAPE鍵
\f 換頁符
\n 換行符
\r 回車鍵
\t 制表符,也就是tab鍵
\v 垂直制表符
0 Shell基礎
0.1 Shell是什么
0.1.1 Shell是什么
Shell是一個命令行解釋器,它為用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序,用戶可以用Shell來啟動、掛起、停止甚至編寫一些程序。
硬件 <-內核 <- Shell命令解釋器<-外層應用程序
? ? ? ? ? ? 0101 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ls
?
Shell還是一個功能相當強大的編程語言,易編寫,易調試,靈活性強。
Shell是解釋執行的腳本語言,在Shell中可以直接調用Linux系統命令。
?
0.1.2 Shell的分類
Bourne Shell:從1979年起UNIX就開始使用bourne Shell,bourne Shell的主文件名為sh
C Shell:C Shell主要在BSD版的UNIX系統中使用,其語法和C語言相類似而得名
?
Shell的兩種主要語法類型有Bourne和C,這兩種語法彼此不兼容。
Bourne家族主要包括sh、ksh、Bash、psh、zsh;
C家族主要包括csh、tcsh。
?
Bash:Bash與sh兼容,現在使用的Linux就是使用Bash作為用戶的基本Shell
?
0.1.3 Linux支持的Shell
/etc/shells文件中記錄的是系統支持的shell
sh ??#此命令用于啟動Shell
exit ?#此命令用于退出Shell
?
0.2 Shell腳本的執行方式
0.2.1 echo輸出命令
echo 選項 變量
作用:將變量顯示到標準輸出
選項:
-e 支持反斜線控制的字符轉換
?
\\ 輸出\本身
\a 輸出警告音
\b 退格鍵,向左刪除 ??
\c 取消輸出行末的換行符
\e ESCAPE鍵
\f 換頁符
\n 換行符
\r 回車鍵
\t 制表符,也就是tab鍵
\v 垂直制表符
\0nnn 按照八進制ASCII碼表輸出字符。其中0為數字零,nnn是三位八進制數。
\xhh ?按照十六進制ASCII碼表輸出字符。其中hh是兩位十六進制數
例子:
echo -e "ab\bc"
#輸出結果是ac
echo -e "\e[1;31mabcd\e[0m"
#輸出顏色,abcd為輸出內容? ?
30m黑 ?31m紅 ?32m綠 ?33m黃 ?34m藍 ?35m洋紅 ?36m青 ?37m白
0.2.2 第一個腳本
vi hello.sh
?
#!/bin/bash
#The first program
#Author:haha (E-mail:haha@xxx.com)
?
echo -e "hello world"
?
0.2.3 執行腳本
賦予執行權限,直接運行
chmod 755 hello.sh
./hello.sh
?
通過bash調用執行腳本,此時不必有執行權限
bash hello.sh
?
cat -A 文件名
#查看隱藏字符,如換行符
?
dos2unix 文件名
#從windows格式轉換成UNIX格式
?
unix2dos 文件名
#從UNIX格式轉換成windows格式
?
0.3 bash的基本功能
歷史命令與命令補全
0.3.1 歷史命令
history 選項 文件名(歷史命令保存文件)
選項:
-c 清空歷史命令
-w 把緩存中的歷史命令寫入歷史命令保存文件(在各自的家目錄中)~/.bash_history
history -c ?#清空緩存歷史命令
history -w ?#將緩存的歷史命令寫入~/.bash_history
history -w tmp.txt ?#將緩存的歷史命令寫入tmp.txt
歷史命令默認會保存1000條,可以在環境變量配置文件/etc/profile中進行修改
?
歷史命令的調用
使用上、下箭頭調用以前的歷史命令
使用“!n”重復執行第n條歷史命令
使用“!!”重復執行上一條命令
使用“!字串”重復執行最后一條以該字串開頭的命令
?
?
0.3.2 命令與文件補全
在bash中,命令與文件補全是非常方便與常用的功能
只要在輸入命令或文件時,按“Tab”鍵就會自動進行補全
?
0.4 命令別名與常用快捷鍵
0.4.1 命令別名
alias 別名='原命令'
#設定命令別名,臨時生效
?
alias
#查詢命令別名
?
命令執行時順序
1、第一順位執行用絕對路徑或相對路徑執行的命令
2、第二順位執行別名
3、第三順位執行bash的內部命令
4、第四順位執行按照$PATH環境變量定義的目錄查找順序找到的第一個命令
???
echo $PATH 打印環境變量的路徑
?
讓別名永久生效:修改家目錄下的.bashrc文件
vi /root/.bashrc
?
刪除別名
unalias 別名
?
0.4.2 bash常用快捷鍵
Ctrl+A 把光標移動到命令行開頭
Ctrl+E 把光標移動到命令行結尾
Ctrl+C 強制終止當前的命令
Ctrl+L 清屏,相當于clear命令
Ctrl+U 刪除或剪切光標之前的命令
Ctrl+K 刪除或剪切光標之后的命令
Ctrl+Y 粘貼Ctrl+U或Ctrl+K剪切的內容
Ctrl+R 在歷史命令中搜索,按下Ctrl+R之后,就會出現搜索界面,只要輸入搜索內容,就會從歷史命令中搜索。
Ctrl+D 退出當前終端 相當于logout
Ctrl+Z 暫停并放入后臺
Ctrl+S 暫停屏幕輸出
Ctrl+Q 恢復屏幕輸出
?
0.5 輸入輸出重定向
0.5.1標準輸入輸出
設備 ???設備文件名 ???文件描述 ???類型
鍵盤? ? ? /dev/stdin ??????0 ??????標準輸入
顯示器 ?/dev/stdout ?????1 ??????標準輸出
顯示器? ?/dev/sdterr ?????2 ??????標準錯誤輸出
?
0.5.2輸出重定向
???類型 ??????????????符號 ??????????????作用
標準輸出重定向 ????
命令 >文件 ?以覆蓋的方式,把命令的正確輸出輸出到指定的文件或設備當中
命令 >>文件 ?以追加的方式
?
標準錯誤輸出重定向?
錯誤命令 2>文件 ?????覆蓋
錯誤命令 2>>文件 ????追加
?
?
正確輸出和錯誤輸出(同時保存)
命令 >文件 2>&1 ???覆蓋
命令 >>文件 2>&1 ??追加
命令 &>文件 ? ?覆蓋
命令 &>>文件 ? 追加
?
正確輸出和錯誤輸出(分別保存) ??????????
命令 >>文件1 ?2>>文件2 ? ?正確追加文件1 ?錯誤追加文件2
?
ls &>/dev/null ???#丟棄沒用的輸出信息ls,不管命令輸出什么,執行就好
?
0.5.3 輸入重定向?
(用的不多,用于給源碼包打補丁)
wc 選項 文件名
選項
-c 統計字節數
-w 統計單詞數
-l 統計行數
?
1、命令wc,回車
2、輸入文本
3、Ctrl+D #統計輸入的行數、單詞數、字符數
?
命令<文件 ??把文件作為命令的輸入
wc<anaconda-ks.cfg ?統計anaconda-ks.cfg文件
wc<<flag
>asdg
>afsda
>gerge
>flag
#統計兩個flag之間的內容(flag是標志)
?
0.6 多命令順序執行與管道符
0.6.1 多命令順序執行
多命令執行符 ???格式 ????????????作用
?????; ?????命令1;命令2 ????多條命令順序執行,命令之間沒有任何邏輯聯系
?????&& ????命令1 &&命令2 ???邏輯與:命令1正確執行,命令2執行,否則命令2不執行
?????|| ? ? ? ?命令1 ||命令2 ????邏輯或:命令1不正確執行,命令2執行,否則命令2不執行
?
dd用于磁盤復制
dd if=輸入文件 of=輸出文件bs=字節數count=個數
?
選項:
if=輸入文件 ?指定源文件或源設備
of=輸出文件 ?指定目標文件或目標設備
bs=字節數 ?指定一次輸入/輸出多少字節,即把這些字節看做一個數據塊
count=個數 ?指定輸入/輸出多少個數據塊
?
例子
date; dd if=/dev/zero of=/root/testfile bs=1k count=10000; date
#判斷復制硬盤用了多長時間
?
命令&&echo yes||echo no
#可以判斷命令是否正確
?
0.6.2管道符
命令1 |命令2
#命令1的正確輸出作為命令2的操作對象
?
例子
ll -a /etc/ | less
netstat -an | grep "ESTABLISHED"
?
grep 選項 “搜索內容” 文件名
選項:
-i 忽略大小寫
-n 輸出行號
-v 反向查找
--color=auto 搜索出的關鍵字用顏色標識
?
0.7 多命令順序執行與管道符
0.7.1 通配符
? 匹配一個字符
* ?匹配多個字符
[] 匹配中括號中的一個字符。如[abc]
[-] 匹配一個范圍。如[a-f]
[^] 匹配不是中括號內的一個字符。如[^0-9],代表匹配一個不是數字的字符
例子:
rm -rf * #清空
ls ?abc
ls [0-9]*
ls [^0-9]*
0.7.2 bash中其他特殊符號
' ' ?單引號 特殊符號如“$”和“`”(反引號)都沒有特殊含義
" " ?雙引號
$ 代表調用變量的值 ?
`引用命令 ?
\ 轉義字符
` ` ?反引號 內容是系統命令,在bash中先執行
$() 同反引號
# 注釋
$ 用于調用變量的值,如需要調用變量name的值時,需要用$name的方式得到變量的值
\ 轉義字符,跟在其后的特殊符號失去作用
?
例子
name=sc
echo $name
echo '$name'
echo "$name"
?
引用一個命令
abc=`date` ?或者 ?abc=$(date)
echo $abc
?
echo '$(date)'
echo "$(date)"
?
0.8 bash變量
0.8.1 什么是變量
變量是計算機內存的單元,其中存放的值可以改變。
當Shell腳本需要保存一些信息時,如一個文件名或是一個數字,就把它存放在一個變量中。
每一個變量有一個名字,所以很容易引用它。
使用變量可以保存有用信息,使系統獲知用戶相關設置,變量也可以用于保存暫時信息。
0.8.2 變量設置規則
由字母、數字、下劃線組成,以字母、下劃線開頭。
默認類型是字符串型
用等號連接,不能有空格
值有空格,用引號引起來
值可以使用轉義字符
值可以疊加。 “$變量名” 或者 ?${變量名}
把命令結果作為變量值賦予變量 ` ` ?$() ?
環境變量名大寫
?
0.8.3 變量分類
用戶自定義變量
環境變量:保存和系統操作環境相關的數據
位置參數變量:向腳本當中傳遞參數,變量名不能自定義,變量作用是固定的
預定義變量:bash中已經定義好的變量,變量名不能自定義,變量作用是固定的
?
0.8.4 本地變量(用戶自定義變量)
例子:
name="ha ha"
?
變量疊加
aa=123
aa="$aa"456
aa=${aa}789
?
變量調用
echo $name
?
變量查看(系統所有變量)
set
?
變量刪除
unset name
?
0.9 環境變量
0.9.1 環境變量是什么?
用戶自定義變量只在當前Shell中生效
環境變量在當前Shell和這個Shell的所有子Shell當中生效
如果把環境變量寫入相應的配置文件,那么這個環境變量就會在所有的Shell中生效
?
0.9.2 設置環境變量
export 變量名=變量值
#聲明變量
?
exprot 變量名
#將已聲明的本地變量變為環境變量
?
env
#查詢變量
?
unset 變量名
#刪除變量
?
bash
#進入子Shell
pstree
#查看進程樹
0.9.3 系統常見環境變量
PATH:系統查找命令的路徑
echo $PATH
PATH="&PATH":/root/sh
#PATH變量疊加,命令行臨時改變
?
PS1:定義系統提示符的變量
\d ?顯示日期,格式為“星期 月 日”
\h ?顯示簡寫主機名。如默認主機名“localhost”
\t ?顯示24小時制時間,格式為“HH:MM:SS”
\T ?顯示12小時制時間,格式為“HH:MM:SS”
\A ?顯示24小時制時間,格式為“HH:MM”
\@ ?HH:MM AM/PM
\u ?顯示當前用戶
\w ?顯示當前所在目錄的完整名稱
\W ?顯示當前所在目錄的最后一個目錄
\# ?執行的第幾個命令
\$ ?提示符。root為#
?
PS1='[\u@\h \W]\$ '
例子
PS1='[\u@\@ \h \# \W]\$ '
?
0.10 位置參數變量
$n ?n為數字,$0代表命令本身,$1-$9代表第一到第九個參數,十以上的參數需要用大括號包含,如${10}
$* ?代表命令行所有參數,$*把所有參數看成一個整體 ??
$@ 也代表命令行中所有的參數,不過$@把每個參數區分對待
$# ?代表命令行中所有參數的個數
?
例子1:
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1 + $num2))
#變量sum的和是num1加num2
echo $sum
#打印變量sum的值
?
例子2:
#!/bin/bash
echo "A total of $# parameters"
echo "The parameters is: $*"
echo "The parameters is: $@"
?
?
例子3:$*與$@的區別
#!/bin/bash
for i in "$*"
????do
????????echo "$i"
????done
?
for i in "$@"
????do
????????echo "$i"
? ? done
?
0.11 預定義變量
其實位置參數變量就是預定義變量的一種
?
$? ?最后一次執行命令的返回狀態。為0則表示正確執行。
$$ ?當前進程的進程號(PID)
$! ?后臺運行的最后一個進程的進程號
?
?
例子 variable.sh
#!/bin/bash
?
echo "The current process is $$"
#輸出當前進程的PID
#這個PID就是variable.sh這個腳本執行時,生成進程的PID
?
find /root -name hello.sh &
#使用find命令在root目錄下查找hell.sh文件
#符號&的作用是把命令放入后臺執行
?
echo "The last one Daemon process is $!"
?
接受鍵盤輸入
read 選項 變量名
選項:
-p "提示信息":在等待read輸入時,輸出提示信息
-t 秒數: ? ?指定等待時間
-n 字符數: ?指定字符數
-s ???: ? ? 隱藏輸入的數據,適用于機密信息的輸入
?
?
例子
#!/bin/bash
?
read -t 30 -p "Please input your name: " name
echo "Name is $name"
?
read -s -t 30 -p "Please enter your age: " age
echoo ?" "
echo "Age is $age"
?
read -n 1 -t 30 -p "Please select your gender[M/F]:" gender
echo ?" "
echo "Sex is $gender"