基礎命令
主要的命令和快捷鍵
Linux系統命令由三部分組成:cmd + [options]+[operations]
查看和修改ip地址ifconfig和ifconfig eth0 +ip地址
cal日歷
date時間date +%Y%m%d輸出日期的數字格式,如20160420
bc計算器
who用戶名字
whoami用戶
lsb_release -a查看系統的版本號
uname -a查看系統的內核版本號
history歷史命令記錄
得到root權限su root
修改root密碼sudo passwd root
關機poweroff或者shutdown now
man幫助命令
ls查看目錄里面文件(或者用tree函數)
ls -al其中-l參數表示要求ls命令列出每個文件的詳細信息,-a參數則要求ls命令還要同時列出隱藏文件,-i可以顯示文件的inode即id。
關于ls -l結果解釋:drwx-wx-wx,10個字符,第一個字符表示文件的類型,然后每三個字符一組,r代表可讀取權限,w代表可寫入權限,x代表可執行權限,若無權限則用-代替。2~4個字符代表該文件所有者user的權限,5~7個字符代表給文件所有組的權限,8~10個字符代表給其他用戶(others)擁有的權限。
改變文件的權限:chmod
給某文件添加用戶讀權限:chmod u+r somefile
給某文件刪除用戶讀權限:chmod u-r somefile
給某文件添加用戶寫權限:chmod u+w somefile
給某文件刪除用戶寫權限:chmod u-w somefile
給某文件添加用戶執行權限:chmod u+x somefile
給某文件刪除用戶執行權限:chmod u-x somefile
添加用戶對某文件的讀寫執行權限:chmod u+rwx somefile
刪除用戶對某文件的讀寫執行權限:chmod u-rwx somefile
給某文件設定用戶擁有讀寫執行權限:chmod u=rwx somefile
#若想給某文件加上可執行權限:chmod +x somefile
cd一鍵返回用戶主目錄
cd ~等同于cd命令
cd -返回上一次來源的目錄
cd ..返回上級目錄
pwd用戶的當前目錄
./用戶的當前目錄
../用戶的父級目錄
ctrl+u清空當前命令行中輸入的命令
ctrl+shift++號使得teminal終端字體變大
ctrl++號使得teminal終端字體變小
shift+pageup\pagedown在命令行的終端進行翻頁
exit退出命令行窗口
touch+文件名可以創建一個文件touch a.txt b.txt c.txt同時創建多個文件
rm+文件名可以刪除文件rm a.txt b.txt c.txt同時刪除多個文件
mkdir+目錄名可以在當前目錄下創建一個目錄mkdir dir1 dir2 dir3 ...,同時創建多個子目錄
mkdir -p a/b/c創建層級目錄使用-p選項
rmdir+目錄名刪除空目錄(此目錄下無任何文件或目錄)?????? rmdir dir1 dir2 dir3同時刪除多個子目錄
通配符*匹配任意長度、任意字符
rm *.txt刪除所有的txt文檔rm e.*
強制刪除非空的子目錄:? mkdir -p a/b/c/d/e???????? rm -rf a
Linux系統中沒有回收站,刪除后不可逆
文件的拷貝cp?????? cp src.c src.c.bak備份src.c為src.c.bak
cp src.c a/src.bak將文件src.c拷貝到a目錄下并且修改名字為src.bak
cp src.c a/拷貝不修改名字
文件的移動mv可以實現文件或目錄的移動或改名字
文件的重命名mv???????? mv src.c.bak src.c修改名字mv a abc修改目錄名字為abc
注:源和目標一般在同一級目錄下是修改名字,在不同的目錄下是進行移動
3個文本編輯器gedit\ed\nano
cat打印某目錄下的某文件內容絕對路徑打印cat /etc/apt/sources.list
gedit文本編輯器,類似于windows里面的txt文本,其中帶有~號的文件為臨時的存儲文本
nano ctrl+o為保持,ctrl+x為退出
tac和cat命令差不多,主要為逆向打印
head默認為文件的前面十行參數為-n
tail默認為文件的尾部十行參數為-n
more對文件進行按百分比打印按空格鍵翻頁
less
tar文件打包命令-c創建一個包-v現實包處理的過程-f必須,無任何含義
tar -cvf ab.tar aa.c shan.e創建一個包
tar -xvf ab.tar解壓一個包
tar -tvf ab.tar查看一個包里面的內容
tar -xvf ab.tar shan.e只解壓包里面的shan.e的文件
tar -xvf ab.tar -C kk/將解壓包里面的文件解壓到kk文件夾中
對文件進行壓縮
gzip代碼:gzip aa.tar壓縮后aa.tar沒了,得到aa.tar.gz
bzip2代碼:bzip2 aa.tar得到aa.tar.bz2
tar代碼:tar -zcvf ac.tar.gz aa.tar新建一個壓縮包名字為ac.tar.gz
tar -jcvf aa.tar.bz2 ac.tar新建一個壓縮包名字為aa.tar.bz2
解壓命令
gunzip代碼:gunzip aa.tar.gz
bunzip2??????????? bunzip2 aa.tar.bz2
tar????????????????????? tar -zxvf aa.tar.gz? ??tar -jxvf aa.tar.bz2??? tar -ztvf aa.tar.bz2
其中-zxvf為tar命令解壓.gz文件-jxvf為tar命令解壓bz2文件
注:gzip和bzip2以及tar不能通過同樣的后綴名進行解壓,必須是經過相同的壓縮方式得到的壓縮包,每種壓縮的算法不一樣.
which可以定位可執行文件所在目錄which ls??????? which pwd
whereis命令定位文件所在目錄1.二進制的-b???? 2.源文件-s???? 3.幫助文檔-m
locate基于數據庫通過名字查找文件最新的文件可能查不到,需要手動更新數據庫,用命令sudo updatedb更新數據庫無論當前目錄在哪里都可以查找文件或者文件夾locate aa.tar
file查看文件的類型
find通過文件名查找文件find+查找目錄+查找內容
find PATH -name FILENAME
find ./ -name 'a*'在當前目錄下查找以a為開頭的文件
find ~/ -name 'a*'在用戶主目錄下查找以a為開頭的文件
三種方式安裝軟件
1.源代碼安裝
2.包安裝.deb包dpkg -i xxx.deb??? sudo dpkg -i包名字
.rpm包rpm -i??? xxx.rpm? sudo rpm -i包名字
3.apt在線安裝sudo apt-get install aptitude -y安裝aptitude軟件
服務器有?sudo? aptitude search軟件名
本機安裝過?sudo? aptitude show軟件名
本機安裝?sudo?? aptitude??? install軟件名
卸載軟件?sudo? aptitude remove軟件名
重新安裝?sudo aptitude reinstall軟件名
安裝tree軟件(一款樹狀結構顯示文件夾內容的軟件)安裝sudo aptitude install tree
sources.list里面記錄aptitude可以訪問apt服務器地址
sudo aptitude update更新sources.list
關于sources.list的更多源,百度搜索ubuntu 15.10 source.list cn99 lup
軟/硬鏈接
軟鏈接類似windows的快捷方式刪除了主文件快捷方式無用了軟鏈接文件->文件名->磁盤存儲區域
ln -s源文件名生成軟鏈接名ln -s /etc/apt x將路徑名字賦給x
硬鏈接多個文件名對應同一區域磁盤扇區塊相當于復制cp
硬鏈接有兩個限制,1.不允許給目錄創建鏈接2.不同分區上的兩個文件之間不能建立硬鏈接
ln源文件名生成硬鏈接文件名
vim編輯器
vi testvi編輯文件
按i可進入vim的編輯模式
按o鍵進入下一行
寫完了按ESC鍵
k鍵向上,j鍵向下,h鍵向左,l鍵向右
Ubuntu自帶版本的vi編輯器為vim-tiny缺少左右光標鍵和語法高亮的設置
安裝完整版的vim編輯器sudo aptitude install vim安裝完成
剛剛進入vi,vi處于一般操作模式,不可寫入文字,只能進行一些操作,稱為操作模式
在操作模式下可以進行1)移動光標2)拷貝、刪除、粘貼
按下字母i進入編輯模式,i在光標前插入字符,a在光標后插入字符按字母o鍵切換到下一行
k鍵向上,j鍵向下,h鍵向左,l鍵向右
保存文檔,按ESC退回操作模式,再按冒號,進入末行命令模式
w為保存,q為退出,q!為舍棄,
gcc -o app ***.c
./app執行C語言文件
vim編輯器文件另存為:首先需要按ESC鍵回到命令模式;然后輸入命令:w filename,文件不存在會自動新建文件。用法示例:另存為文件為zhidao.txt??? :w zhidao.txt文件默認保存在當前工作路徑。
同一文件內文本復制與粘貼的操作
在操作模式下,按o為光標下一行插入一行,按shift+o為向上插入一行;
按yy為復制光標所在的行,按nyy為光標所在行起復制n行;
按dd為剪切光標所在的行,按ndd為光標所在行起剪切n行;
按p為光標所在行下面粘貼,按shift+p為光標所在行上面粘貼;
vi編輯器中,操作模式時按v鍵進入反選模式,從當前光標進入反選,然后對選中的文字進行操作。
在操作模式下,按x為刪除字符;
在操作模式下,按r,為替換模式,替換某個字符;
set nu為顯示行號
set nonu為不顯示行號;
syntax on為顯示語法高亮;
syntax off為關閉語法高亮;
多個文本之間的內容拷貝
一、在末行命令中打入e +另一個文件名編輯文件,然后用nyy命令進行拷貝,然后在切換,用p命令
二、在末行命令中打入sp+另一個文件名進入分屏,然后利用yy和p命令進行拷貝和粘貼,ctrl+ww為兩個窗口光標切換
三、在末行命令中打入vsp+另一個文件名進入分屏,然后利用yy和p命令進行拷貝和粘貼,ctrl+ww為兩個窗口光標切換
末行命令:wqall為全部存盤退出
vim編輯器中的查找
在操作模式中打入/+需要搜索的內容,按n可以切換下一個,N切換上一個
在幫助手冊manul中/+搜索的內容
/為從當前光標向后搜索,?是從當前光標先前搜索;
vim編輯器中的替換
在操作模式下打入:起點,終點s/被替換的字符串/替換成的字符串/g
其中起點和終點是行號
例如:2,9s/int/float/g
全文替換為%s/float/int/g
按u是撤銷操作
%s/float/int/gc對每一個需要替換的字符都要進行確認;
管道函數
Linux中管道函數用|來連接兩個命令,它可以把一個命令的輸出內容當做下一個命令的輸入內容,兩個命令之間只需要使用管道符連接即可。
grep
grep [ivnc] '需要匹配的字符'文件名
-i不區分大小寫
-c統計包含匹配的行數
-n輸出行號
-v反向匹配,不包含含有匹配字符的行
grep函數默認區分大小寫,如需要忽略大小寫,選項-i
sort
sort [-ntkr]文件名
-n采取數字排序
-t指定分隔符
-k指定第幾列
-r反向排序
對輸出內容直接排序時,默認按照每行的第一個字母進行排序
例子:cat sort.txt | sort -r,按照第一列進行排序
cat sort.txt | sort -t ":" -k 2按照第二列進行排序,用:分隔符分裂,但是按照名字排序
cat sort.txt | sort -rnt ":" -k 2
按照第二列數字大小進行逆向排序,分隔符為":"
sort -t ":" -k 2 -n sort.txt
uniq
刪除重復內容
uniq [-ic]
-i忽略大小寫
-c計算重復行數
注意:uniq一般和sort的連用,因為uniq只會比較相鄰的行,所以必須先排序然后再刪除重復的行
例如:sort -n uniq.txt | uniq -c
cut
使用cut截取文本
cut -f指定的列-d "分隔符"
例如:cut -f1,6-7 -d':'
想要打印每行第1-5個字符,以及7-10個字符,使用命令:
cut -c1-5,7-10 passwd
tr
做文本轉換
主要作用在于文本轉換或者刪除
-c用字符串1中字符集的補集替換此字符集,要求字符集為ASCII。
-d刪除字符串1中所有輸入字符。
-s刪除所有重復出現字符序列,只保留第一個;即將重復出現字符串壓縮為一個字符串。
例如,將小寫字母轉換為大寫字母命令:cat passwd | tr '[a-z]' '[A-Z]'
刪除冒號命令,使用:
cat passwd | tr -d ':'
將文件file中出現的"abc"替換為"xyz"
cat file | tr "abc" "xyz" > new_file
把文件中的數字0-9替換為a-j
# cat file | tr [0-9] [a-j] > new_file
paste
函數用于連接兩個文件
paste a.txt b.txt
-d指定在合并文件時行間的分隔符
實現文本合并cat a.txt b.txt >new
split
分割文件
#按照行進行分割,-l參數制定每500行為一個小文件
split -l 500 big_file.txt small_file_
#分割完成后,當前目錄下會生成很多小文件
如果文件是二進制的,則只能按照文件大小分割
ll –h big_bin
split –b 64m big_bin small_bin
echo命令
echo為打印某條指令
正則化表達式與通配符
"."符號
點符號用于匹配除換行符之外的任意一個字符。例如,r.t可以匹配rot,rut,但是不能匹配root。
例:grep 'r..t' /etc/passwd
"*"符號
"*"符號用于匹配前一個字符0次或者任意多次,比如ab*,可以匹配a、b、abb等。"*"號經常和"."號一起使用,比如”.*”代表任意長度的不包含換行的字符。
例如:”r.*t”代表查找包含字母r,后面緊跟任意長度的字符,再跟一個字母t的行。
“\{n,m\}”符號
雖然”*”可用于重復匹配前一個字符,但卻不能精確的控制匹配的重復次數,使用“\{n,m\}”符號則能達到要求。
“\{n\}”符號匹配前面的字符n次,“\{n,\}”匹配前面的字符至少n次以上(含n次)。
“\{n,m\}”匹配前面的字符n到m次。
“^”符號
這個符號用于匹配開頭字符的行
例如:grep ‘^root’ /etc/passwd
“$”符號
用于匹配結尾字符的行
例如:grep ‘^r.*h$’ /etc/passwd
符號“^$”則代表改行為空
“[ ]”符號
用于匹配方括號內出現的任一字符。用符號“-”作限定
例如:[A-Za-z]匹配所有的字母,[^A-D]代表取反即除了字母A-D以外的字母,例如:“^1[38][0-9]\{9\}”代表手機號碼
“\”符號
為轉義符。比如[ \- ]此時”\-”代表“-”,再如想打入一個點,則\.*代表匹配任意長度的點號。
“\<”符號和“\>”
這兩個符號分別用于界定單詞的左邊界和右邊界。
比如“\”則用于匹配以”hello”結尾的單詞。
“\<\>”則用于精確匹配任意一個字符串。
例如:grep “\”
\n為換行符,\r為一個回車符,\t為一個制表符,\f為一個換頁符,\s為任何空白字符,\S為任何非空白字符。
擴展的正則表達式
在使用這些擴展符號前需要使用命令egrep。
“?”符號
“?”符號用于匹配前一個字符0次或1次,所以”ro?t”僅能匹配rot或者rt.
“+”符號
“+”符號用于匹配前一個字符1次以上,所以”ro+t”就可以匹配rot、root.
“|”符號
“|”符號是”或”的意思,即多種可能的羅列
例如:^0[0-9]\{2\}-[0-9]\{8\} | ^0[0-9]\{3\}-[0-9]\{8\}
“|”符號
“()”符號通常和”|”符號連用,用于枚舉一系列可替換的字符。
例如021-88888888和0511 88888888可以使用代碼:^0[0-9]\{2,3\}(-| )[0-9]\{8\}
再如:h(ar|oo|ol)d可以匹配hard, hold或hood
特殊的POSIX字符,示例如下:
grep支持一類特殊的POSIX字符:
[:alnum:]文字數字字符
[:alpha:]文字字符
[:digit:]數字字符
[:graph:]非空字符(非空格、控制字符)
[:lower:]小寫字符
[:cntrl:]控制字符
[:print:]非空字符(包括空格)
[:punct:]標點符號
[:space:]所有空白字符(新行,空格,制表符)
[:upper:]大寫字符
[:xdigit:]十六進制數字(0-9,a-f,A-F)
例如:搜索以數字開頭的行:grep ^[[:digit:]] zzbds.txt
注意:需要多加上一層中括號
通配符
“*”符號
“*”符號代表0個或多個字符。比如*.doc代表所有以.doc結尾的文件。A*.doc代表以字母A開頭的doc文件。
“?”符號
“?”符號代表的是任意的一個字符,例如A?.doc代表的是以字母A開頭,文件名第二個字母為任意字母的doc文件。
“{}”符號
可以匹配所有括號內包含的以逗號隔開的字符。
例如:ls –l {A,B,C}.doc和命令ls –l [A-C].doc列出所有以字母A,B,C開頭.doc結尾的文件
嵌套功能:ls –l {[A-Z]*.doc,[0-9]??.txt}
“^”符號和“!”符號
這兩個符號往往和”[]”一起使用,當出現在”[]”中的時候,代表取反。
文本處理工具sed
sed處理文本時是以行為單位的,每處理完一行就立即打印出來,然后再處理下一行,直至全文處理結束。sed可做的編輯動作包括刪除、查找替換、添加、插入、從其他文件中讀入數據等。
sed命令使用的場景包括以下:
常規編輯器編輯困難的文本。
太過于龐大的文本,使用常規編輯器難以勝任(比如vi一個幾百兆的文件)
有規律的修改文本,加快文本的處理速度
sed修改文件流的方式如下:sed [options] ‘command’ file
# ‘command’命令均為vi編輯器中的命令
# sed命令默認不修改原文件,如果希望保存修改后的文件則需要用重定向’>’
#使用-e參數和分號連接多編輯命令
例如:sed –e ‘s/this/That/g’ –e ‘s/line/LINE/g’ sed.txt或者sed ‘s/this/That/g’ ; ‘s/line/LINE/g’ sed.txt
刪除
sed ‘1d’ sed.txt >save.txt #刪除第一行
sed ‘1,3d’ sed.txt #刪除1到3行
sed ‘1,$d’ sed.txt #刪除1到最后一行
sed ‘$d’ sed.txt? #刪除最后一行
sed ‘5!d’ sed.txt? #只保留第五行
sed ‘/Empty/d’ sed.txt #刪除所有包含Empty的行
sed ‘/^$/d’ sed.txt #刪除空行
查找替換
使用s命令可將查找到的匹配文本內容替換為新的文本。
sed ‘s/line/LINE/’ sed.txt? #將line替換為LINE,每行默認替換一個
sed ‘s/line/LINE/2’ sed.txt? #將line替換為LINE,每行默認替換兩個
sed ‘s/line/LINE/g’ sed.txt? #將line替換為LINE,全部替換
sed ‘s/^this/That/’ sed.txt? #只替換開頭的this為That
#命令中間不能有空格
字符轉換
使用y命令可進行字符轉換,其作用為將一系列字符逐個的變換為另外一系列字符,基本用法如下:
sed ‘y/OLD/NEW/’ file? #將全文中字母O替換為N,字母L替換為E,字母D替換為W.
插入文本
使用i或者a命令插入文本,其中i代表在匹配行之前插入,而a代表在匹配行之后插入.
sed ‘2 i Insert’ sed.txt? #在第二行之前插入文本
sed ‘2 a Insert’ sed.txt? #在第二行之后插入文本
sed ‘/Second/ i \Insert’? #在匹配行之前插入文本
讀入文本
使用命令r可以從其他文件中讀取文本,并插入匹配行之后.
sed ‘/^$/r? /etc/passwd’ sed.txt? #將/etc/passwd中的內容讀取到sed.txt空行之后
打印
使用p命令可進行打印,這里使用sed命令時一定要加參數-n,表示不打印沒關系的行。
例:sed –n ‘1p’ sed.txt? #只打印第一行
#sed實際處理了第二行,其他幾行由于沒有匹配所以并未真正處理。
再如:sed –n ‘s/the/THE/gp’ sed.txt #只打印實際處理過的行,簡化了輸出,第二行the全部轉換為THE
寫文件
sed本身默認并不改寫原文件,而只是對緩沖區的文本做了修改并輸出到屏幕。所以想保存文件,除了使用重定向或-i,還可以使用w命令將結果保存到外部指定文件。
例如:sed –n ‘1,2 w output’ sed.txt #這里沒有任何的輸出,因為輸出被重定向到文件output
#將sed.txt文件中1,2行寫入文件output中
sed腳本
將動作靜態化的寫到某個文件中,然后調用sed命令并使用-f參數指定該文件。
vi sed.rules
s/this/THAT/g
/^$/d
sed sed.rules sed.txt
高級替換
替換匹配行的下一行,使用n命令
例如:sed ‘/^${n;s/line/LINE/g}’ sed.txt
文本處理工具awk
awk是基于列的處理工具,它的工作方式是按行讀取文本并視為一條記錄,每條記錄以字段分割成若干字段,然后輸出各字段的值。awk認為文件都是結構化的,也就是說都是由單詞和各種空白字符組成的,“空白字符”包括空格、tab、連續的空格和tab等。每個非空白的部分叫做域,從左到右依次是第一個域,第二個域。$1,$2表示第一域第二個域,$0表示全部域。
打印指定的域
#打印第一個和第四個列awk ‘{print $1,$4}’ awk.txt
#打印全部內容awk ‘{print $0}’ awk.txt
指定打印的分隔符
默認情況下awk是使用空白字符作為分隔符的,但是也可以通過-F參數指定分隔符來區分不同的域(類似于cut命令).
注意:必須得使用單引號不能使用雙引號.
例如:awk –F’.’ ‘{print $1,$2}’ awk.txt
打印每行的列數內部變量NF參數
awk ‘{print NF}’ awk.txt? #打印每行的列數,指定不同的分隔符會有不同結果
打印固定域
在NF前加上$符號,則代表最后一列,這樣不管有多少列,只要使用$NF就能打印出最后一行。倒數第二行為$(NF-1)
例如:awk ‘{print $NF}’ awk.txt awk ‘{print $(NF-1)}’ awk.txt
截取字符串
使用substr函數對指定域截取字符串
substr(指定域,第一個開始字符的位置,第二個結束的位置)
#其中第二個結束的位置可以為空,這樣默認輸出到該域的最后一個字符
例如:cat awk.txt | awk ‘{print substr($1,6,2)}’ #輸出第一個域從第六個字符開始長度為2的字段
內部變量length
使用內部變量length可以確定字符串的長度
例如:cat awk.txt | awk ‘{print length}’
使用awk求列和
例如: cat awk.txt | awk ‘BEGIN{total=0}{total+=$3}END{print total}’ #求年齡的和
cat awk.txt | awk ‘BEGIN{total=0}{total+=$3}END{print total/NR}’ #求年齡的平均值
NR為內部變量,表示已經讀取的記錄數
Shell編程
第一個例子:
vi HelloWorld.sh
輸入:#!/bin/bash
#this is a comment
echo ‘HelloWorld!’
:wq保存退出
運行:在當前目錄下bash HelloWorld.sh
或者改變文件的執行權限,chmod +x HelloWorld,然后打入./HelloWorld運行
Shell的內建命令
1.如何確定內建命令:type
判斷一個命令是否是內建命令使用type函數
例如:type cd
:cd is a Shell builtin
2.執行程序:”.”
使用點號執行沒有加權限的腳本可以正常運行
. ./HelloWorld.sh? #兩個點之間需要加一個空格,否則../代表當前目錄的上一層目錄
3.別名alias
alias可用于創建命令的別名,若直接輸入該命令且不帶任何參數,則列出當前用戶使用了別名的命令。
創建命令的別名如下:
alias myShutdown =’shutdown –h now’
該命令只能在當前的Shell環境有效,重新登錄則消失??蓪⒃摋l目寫到用戶目錄的.bashrc文件中
4.刪除別名:unalias
unalias ll
5.任務前后臺切換:bg,fg,jobs
6.改變目錄:cd
7.聲明變量declare,typeset
8.打印字符:echo
echo用于打印字符,典型用法是使用echo命令并跟上使用雙引括號的內容,-n命令可以使得不打印換行符。
9.跳出循環break
10.控制循環:continue
13.退出shell:exit
14.環境變量聲明export
例如:export var=1
16.整數運算:let
17.當前目錄顯示:pwd
18.聲明局部變量:local
19.從標準輸入讀取一行到變量:read
20.定義函數返回值:return
21.向左移動位置函數:shift
變量賦值和取值
變量名=變量名
注意1:變量名和變量名之間用等號緊緊相連,之間沒有任何的空格
注意2:當變量中有空格時必須用引號括起,否則會出現錯誤
變量的取值只需要在變量前加上$符號即可,嚴謹的寫法是${}
注意3:當變量值引用的是其他變量,則必須使用雙引號,因為單引號會阻止shell解釋特殊字符$,例如john=1;name=”$john”,echo $name結果為1
取消變量unset
例如:name=john; echo $name ;unset name注意:unset+變量名不需要$符號
取消函數:
unset_funciont(){echo “Hello World!”
}
unset unset_function
特殊參數
位置參數:腳本本身為$0,第一個參數為$1,第二個參數為$2,第三個為$3,以此類推。當參數大于9時,需要用括號${}將其括起來標識;$#表示腳本參數的個數總和,$@或者$*表示腳本的所有參數。$?永遠是上一個命令的返回值。
數組
數組的定義:declare –a Array; Array[0]=0;Array[1]=1;Array[2]=”HelloWorld”
數組還可以在創建的同時賦值declare –a Name=(‘john’ ‘sue’);Name[2]=’Wang’
或者直接不使用declare關鍵字:Name=(‘john’ ‘sue’)
注意:輸入數據時候一定要用空格將其分開,逗號不行。
還可以給特定的元素賦值。Score=([3]=3 [5]=5 [7]=7)
數組操作:
1.最簡單的操作就是數組取值,其格式為:${數組名[索引]}
例如:echo ${Array[0]}
指定索引只能列舉單個元素,要是想一次性取出所有元素的值,可以采取兩種方式:
echo ${Array[@]}或者echo${Array[*]}
注意:echo ${Array[@]}得到的是以空格隔開的元素值,而echo ${Array[*]}得到的是一整個字符串。
2.數組的長度,即元素的個數
利用@或者*字符,可以將數組擴展成列表,然后使用#號來獲取數組元素的個數。
例如:echo ${#Array[@]}或者echo ${#Array[*]}
3.數組截取:可以截取某個元素的一部分,對象可以是真個數組或者某個元素。
#取出數組的第一、二個元素
echo ${Array[@]:1:2}
#取出第二個元素從0個字符開始連續5個字符
echo ${Array[2]:0:5}
4.連接數組:將若干個數組進行拼接操作
Conn=(${Array[@]} ${Name[@]})
5.替換元素:將數組內某個元素的值替換成其他值。
${數組名[@或#]/查找字符/替換字符}
Array=(${Array[*]/HelloWorld/HelloJohn})
echo ${Array[*]}
6.取消數組或者元素:和取消變量一樣,取消一個數組的方式也是用unset命令。
unset Array[1] #取消第二個元素
unset Array? #取消數組
只讀變量
只讀變量又稱為常量,是通過readonly內建命令創建的變量。這種變量在聲明時候就要求賦值,并且之后無法更改,這和之前講到的使用declare –r聲明只讀變量的效果是一樣的。
# readonly RO=100
RO=200? #會報錯
轉義符和引用
shell中的轉義符是反斜線”\”,使用轉義符的目的是使轉義符后面的字符單純的作為字符出現。
例如,想要打印字符$Array,使用命令echo $Array,由于變量Array并未賦值,故打印的是空的,此處應該加上轉義符,即echo \$Array,結果顯示$Array
常見的特殊符號
引用
引用是指將字符串用某種括號括起來,以防止特殊字符被解析為其他意思。
1.部分引用
部分引用是指用雙引號括起來的引用。在這種引用方式中,$符號、`引號,轉義符(\)這三種特殊字符依然會被解析為特殊的意義。
例如:var=”A?? B?? C”
如果輸入echo $var,則輸出的內容只保留了每個字母間一個空格
如果想要完全的按照格式保留原來的變量,打入echo “$var”
2.全引用
全引用是指用單引號括起來的引用。單引號中的任何字符都只當做是普通字符(除了單引號本身,也就是說單引號中間無法在包含單引號,即便轉義符轉義單引號也不行)。
例如:echo ‘$var’如果想輸出變量$var,則需要使用雙引號。
命令替換
命令替換是指將命令的標準輸出作為值賦給某個變量。
使用的方式有兩種。
1.使用反引號` , `命令`
2.使用$(),$(命令)
注意:如果被引用的命令輸出的內容包括多行,此時若不通過雙引號引用的方式輸出變量,則輸出的內容中將會刪除換行符,文件名之間會使用系統默認的空來填充,即輸出的內容只占一行。
例如:var=$(ls -l); echo $var; echo “$var”
運算符
shell中的運算符主要有比較運算符(用于整數比較)、字符串運算符(用于字符串測試)、文件操作運算符(用于文件測試)、邏輯運算符、算數運算符、位運算符、自增自減少運算符。
使用$[]做運算
x=1;y=2;echo $[x+y];
使用bc做運算
在Linux下使用bc的最簡單的方式是直接輸入命令bc。
#bc默認情況下并不顯示小數部分,需要設置顯示的小數位數,scale=3設置為三位小數輸出。
比較運算:2>1 ?? 2<1???????? 1==1?????? 1&&2???? 1&&0???? 1||0???????? 1||2???????? !0
例如:希望一次性處理多個計算
cat cal.bc
12*34;34/12;scale=3;34/12;a=1;b=2;a+b
cat cal.bc | bc
echo ‘scale=100;sqrt(3)’ |bc
有時候需要在shell程序里面直接調用bc計算表達式,并將結果復制給變量以參與后面的計算或者判斷。這里給出了一個求和的例子:
#!/bin/bash
num1=10
num2=15
total=$(echo “num1+num2”|bc)
echo $total
shell中的特殊字符
通配符
常見的通配符有*、?和[]括起來的字符序列。
引號
引號包括單引號和雙引號,單引號又叫做“全引用”或“強引用”;雙引號又稱為“部分引用”或者“弱引用”,所有用雙引號括起來的字符除了美元符號、反斜線、反引號依然保留用途外,其他的字符都作為普通字符處理;而所有的單引號括起來的部分都作為普通字符處理,但是要注意單引號中間不能再出現單引號,否則shell會無法判別到底哪里是單引號的氣質位置。
注釋符
shell使用#作為注釋符。但是如果#號后面出現!,則不會作為注釋符。
反引號
反引號用于命令替換,和$()的作用相同,表示返回當前命令的執行結果并賦值給變量。
測試和判斷
使用$?來進行判斷。
判斷為真則返回0,為假則返回非0。
測試結構
第一種方式:test expression
第二種方式:使用[ expression ],[]中間有兩個空格
判斷一個文件是否存在,例如:
test –e /var/messages
echo $?
字符串測試
shell中的字符串比較主要有等于、不等于、大于、小于、是否為空等測試。
字符串測試
說明
-z “string”
字符串string為空時返回真,否則為假
-n “string”
字符串string非空時返回真,否則為假
“string1”=” string2”
字符串string1和string2相同時返回為真,否則為假
“string1”!=” string2”
字符串string1和string2不同時返回為真,否則為假
“string1”>” string2”
按照字典排序,字符串string1排在string2之前返回為真,否則為假
“string1”<” string2”
按照字典排序,字符串string1排在string2之后返回為真,否則為假
例如:str1=””?????? str2=”hello”??? test –z “$str1”??????? [ “$str1”=”$str2” ]? [ “$str1”\>”$str2” ]
如果不想使用轉義符,則可以使用[[]]括起來表達式
整數比較
比較兩個整數的大小關系
測試成立返回0,否則則返回非0數值。
測試方法一:test “num1” num_operator “num2”
測試方法二:[ “num1” num_operator “num2” ]
其中num_operator是整數測試符常見的整數測試符如下:
整數比較
說明
“num1” –eq “num2”
如果兩個值相等則返回真,否則返回假。equal
“num1” –gt “num2”
如果大于則返回真,否則返回假。great than
“num1” –lt “num2”
如果小于則返回真,否則返回假。less than
“num1” –ge “num2”
如果大于等于則返回真,否則返回假。great equal
“num1” –le “num2”
如果小于等于則返回真,否則為假。less equal
“num1” –ne “num2”
如果不等于返回真,否則返回假。not equal
邏輯測試符和邏輯運算符
邏輯測試用于連接多個測試文件,并返回整個表達式。邏輯測試主要有邏輯非、邏輯與、邏輯或三種。
邏輯測試表如下:
邏輯運算
說明
!expression
如果expression為真,則測試結果為假
expression1 –a expression2
expression1和expression2同時為真,則測試結果為真,否則為假
expression1 –o expression2
expression1和expression2只要有一個為真,則結果為真,同時都假則結果為假
[! –e /var/log/messages]和[-e /var/log/messages01]
[! –e /var/log/messages –a –e /var/log/messages01]
或者采用以下的寫法:
! [ -e /var/log/messages ] && [ -e /var/log/messages01 ]? #記得加上空格
if判斷結構
語法結構如下:
if expression; then
command
fi
如果expression測試返回真,則執行command。如果要執行的不止一條命令,則不同命令用換行符隔開,如下所示:
if expression;then
command1
command2
…
fi
例子:
#!/bin/bash
echo -n "Please input a score:"
read SCORE
if [ "$SCORE" -lt 60 ];then
echo "C"
fi
if [ "$SCORE" -lt 80 -a "$SCORE" -ge 60 ];then
echo "B"
fi
if [ "$SCORE" -ge 80 ];then
echo "A"
fi
if/else判斷結構
if/else判斷結構語法結構:
if expression;
then??????? command
else???????? command
fi
#!/bin/bash
#讀兩個數,判斷這兩個數是否相等
read x y
if [ $x -eq $y ];
then echo "$x=$y"
else echo "$x!=$y"
fi
#多層嵌套
#!/bin//bash
echo –n “Please input a score:”
read SCORE
if [ “$SCORE” –lt 60 ];then
echo “C”
else if [“$SCORE” –lt 80 –a “$SCORE” –ge 60 ];then
echo “B”
else if [“$SCORE” –ge 80 ];then
echo “A”
fi
fi
fi
換種寫法
#!/bin//bash
echo –n “Please input a score:”
read SCORE
if [ “$SCORE” –lt 60 ];then
echo “C”
elif [“$SCORE” –lt 80 –a “$SCORE” –ge 60 ];then
echo “B”
else [“$SCORE” –ge 80 ];then
echo “A”
fi
case判斷結構
用case來做多分支的結構語法結構如下:
case VAR in
var1)?????? command1 ;;
var2)?????? command2 ;;
var3)?????? command3 ;;
…
*)??? command;;
esac
其原理為從上到下依次比較VAR和var1\var2\var3的值是否相等,如果匹配相等則執行后面的命令語句,在無一匹配的情況下匹配最后默認的*,并執行后面的默認命令。要注意的是,case判斷結構中的var1\var2\var3等這些值只能是常量或正則表達式。
循環
for循環語法結構
for var in (list)
do
command
done
#這里的列表是一系列以空格分隔的值。shell每次從這個列表中取出一個值,然后運行do/done之間的命令,直到取完列表中的所有的值。
#!/bin/bash
for I in 1 2 3 4 5 6 7 8 9
do
echo $i
done
注意:for循環里面可以in (list)也可以in ${數組[*]},之前可以先定義一個列表變量或者數組變量。
#!/bin/bash
fruits=”apple orange banana pear” #此處也可以定義為fruits=(apple orange banana pear)
for fruit in ${fruits}?????????????????????????? #此處應該改為for fruit in ${fruits[*]}
do
echo “$fruit is John’s favourite”
done
echo “No more fruits”
seq命令用于產生一個整數數列。seq 5 = 1 2 3 4 5
默認從1開始,步長為1
格式為:seq起始數字步長結束數字
例子:
#!/bin/bash
sum=0
x=$(seq 1 2 100)
for i in ${x}
do
let “sum+=i”#或者代碼sum=$[sum+i]或者sum=$((sum+i))
done
echo $sum
類C的for循環
shell支持類C的for循環,具體結構為:
for((i=1;i<=10;i++))
do
echo –n “$i”? #此處echo加上選項-n是不換行打印
done
echo
while循環
while循環的語法結構為:
while expression
do
command
done
首先while將測試expression的返回值,如果返回值為真則執行循環體,返回值為假則不執行循環。循環完后進入下一次循環之前再次測試。
#!/bin/bash
count=5
while [ $count –gt 0 ]
do
echo –en “$count\n”
let count=count-1
done
#注意:echo打印函數默認是每行打印一個元素,-n選項使得不換行,-e選項激活轉義符\
#注意:[]和[[]]的區別在于[]中間使用-a –o這種邏輯符號,而[[]]則使用&& ||這種邏輯連接符號
#注意:運算符號有三種let expression、$[expression]、$((expression))
echo $?就是輸出上次腳本的退出碼。如果是0說明上次腳本執行成功,如果非0說明上次腳本執行失敗。
例子
#!/bin/bash
sum1=0
sum2=0
i=1
while [ $i -le 100 ]
do
let sum1=sum1+i
if [[ $(($i%2)) -ne 0 ]];then
let sum2=sum2+i
fi
let i=i+1
done
echo -en "sum1=$sum1\nsum2=$sum2\n"
使用while按行讀取文件
cat student.txt
john 30 boy
sue 28 girl
wang 25 boy
xu 23 girl
#!/bin/bash
while read LINE
do
NAME=`echo $LINE |awk '{print $1}'`
AGE=`echo $LINE |awk '{print $2}'`
SEX=`echo $LINE |awk '{print $3}'`
echo "My name is $NAME ,I'm $AGE years old ,I'm a $SEX ."
done < student.txt
until循環
until循環的語法結構為:
until expression
do
command
done
例子
#!/bin/bash
sum1=0
sum2=0
i=1
until [ $i -gt 100 ]
do
let sum1=sum1+i
if [[ $(($i%2)) -ne 0 ]];then
let sum2=sum2+i
fi
let i=i+1
done
echo -en "sum1=$sum1\nsum2=$sum2\n"
函數
shell中函數的語法結構為:
function FUNCTION_NAME( ){
command1
command2
…
}
#打印Hello的例子
#!/bin/bash
function sayHello(){
echo “Hello”
}
echo “Call function sayHello”
sayHello
#判斷文件是否存在在例子
#!/bin/bash
FILE=/etc/notExistFile
function checkFileExist(){
if [ -f $FILE ];then
return 0
else
return 1
fi
}
echo “Call function checkFileExist”
checkFileExist
if [ $? –eq 0 ];then
echo “$FILE exist”
else
echo “$FILE not exist”
fi
帶參數的函數
#!/bin/bash
FILE=/etc/notExistFile
function checkFileExist(){
if [ -f $FILE ];then
return 0
else
return 1
fi
}
echo “Call function checkFileExist”
checkFileExist $1
if [ $? –eq 0 ];then
echo “$FILE exist”
else
echo “$FILE not exist”
fi
#執行腳本時候,輸入bash checkFileExist.sh /etc/passwd后面加上參數
下面是接受兩個參數的例子:
#!/bin/bash
function power(){
x=1
y=0
if [[ $2 –gt $y ]];then
for((i=1;i<=2;i++))
do
let “x=x*$1”
done
fi
echo $x
}
power $1 $2
#運行bash power.sh 2 2