Shell脚本基础介绍
shell基礎簡介:
編寫腳本通常使用某種基于解釋器的編程語言。而shell腳本不過就是一些文件,我們能將一系列需要執行的命令寫入其中,然后通過shell來執行這些腳本。
進入Linux系統(Ubuntu),打開終端Terminal,”$”表示普通用戶,”#”表示超級用戶。其實此時打開的即為shell終端。注意:Redhat/CentOS系統默認安裝的shell是bash,它是sh的增強版,Ubuntu默認安裝的shell是dash。通過執行:$ ll? /bin/sh ,可以發現Ubuntu中的/bin/sh指向的是dash而不是bash,/bin/sh是個軟連接,你也可以通過軟連接的方式使/bin/sh指向bash:$ sudo ln -s /bin/bash /bin/sh 。
shell腳本通常是一個以#!起始的文本文件,如#!/bin/bash或#!/bin/sh。Linux環境下的任何腳本語言,都是以這樣一個被稱為shebang的特殊行作為起始的。在這行中,字符#!被置于解釋器路徑之前。/bin/bash是Bash的路徑。
有兩種運行腳本的方式:一種是將腳本作為sh的命令行參數,另一種是將腳本作為具有執行權限的可執行文件。
將腳本作為命令行參數時的運行方式為:$ shscript.sh或$ sh /home/spring/script.sh 。如果將腳本作為sh的命令行參數來運行,那么腳本中的shebang行也就沒什么用處了。
為了使shell腳本能夠自己獨立運行,需要具備可執行權限。要是腳本獨立運行,必須利用shebang行。它通過使用位于#!之后的解釋器來運行腳本。運行方式為:$ ./script.sh .
shell程序讀取腳本的首行,查看shebang行是否為#! /bin/bash。它會識別/bin/bash,并在內部以如下命令行執行該腳本:$ /bin/bash script.sh
在Bash中,每個命令或是命令序列 是通過使用分號或換回符來分隔的。
???????? 字符#指明注釋的開始。注釋部分以#為起始,一直延續到行尾。注釋行通常用于為代碼提供注釋信息,或者用于暫停執行某行代碼。
終端打印:終端作為交互式工具,用戶可以通過它與shell環境進行交互。
echo是用于終端打印的基本命令。在默認情況下,echo在每次調用后會添加一個換行符。只需要使用帶雙引號的文本,結合echo命令就可以將該文本在終端中打印出來。類似地,不帶雙引號的文本也可以得到同樣的輸出結果。使用單引號也可以完成同樣的任務。雖然,這些方法看起來相似,但各有一些特殊用途和副作用。
在默認情況下,echo會將一個換行符追加到輸出文本的尾部。可以使用標志”-n”來忽略結尾的換行符。如果需要使用轉義序列,則采用echo -e 這種形式。
另一個可用于終端打印的命令是printf。它使用的參數和C語言中的printf函數一樣。printf使用引用文本或由空格分隔的參數。可以在printf中使用格式化字符串,如%s、%c、%d等,還可以指定字符串的寬度、左右對齊方式等。在默認情況下,printf并不像echo命令一樣會自動添加換行符,我們必須在需要的時候手動添加”\n”。
#! /bin/bash# shell script -- test7.sh
# echo和sprintf的用法
# Spring 2015-04-22echo "hello, beijing"
echo "$(pwd)"
echo '$(pwd)' #結果并不是希望得到的
echo $(pwd)
echo -n what is your name?
echo 'hello, spring'
echo -e "1\t2\t3"printf "hello, world\n"
printf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564
???????? 變量:腳本語言通常不需要在使用變量之前聲明其類型。只需要直接賦值就可以了。在Bash中,每一個變量的值都是字符串。無論你給變量賦值時有沒有使用引號,值都會以字符串的形式存儲。有一些特殊的變量會被shell環境和操作系統環境用來存儲一些特別的值,這類變量被稱為環境變量。
???????? 可以使用env命令在終端中查看所有與此終端進行相關的環境變量。
???????? 一個變量可以通過以下方式進行賦值:var=value ,var是變量名,value是賦給變量的值。如果value不包含任何空白字符(如空格),那么它不需要使用引號進行引用,反之,則必須使用單引號或雙引號。
???????? export命令用來設置環境變量。至此之后,從當前shell腳本執行的任何程序都會繼承這個變量。
???????? 常用的環境變量有:PAHT、HOME、PWD、USER、UID、SHELL等。
#! /bin/bash# shell script -- test8.sh
# 變量的使用
# Spring 2015-04-22var=value #var = value 是錯誤的,"="兩邊不能有空格echo $var #注意echo $(var) 是錯誤的
echo ${var}fruit=apple
count=5
echo "We have $count ${fruit}(s)"var1=1234567890
echo ${#var1} #獲得變量值的長度
???????? 通過shell進行數學運算:let命令可以直接執行基本的算數操作。當使用let時,變量名之前不需要再添加”$”。操作符”[]”的使用方法和let命令類似。也可以使用”(())”,但使用”(())”時,變量名之前需要加上$。expr同樣可以用于基本算數操作。以上這些方法只能用于整數運算,而不支持浮點數。
bc是一個用于數學運算的高級工具,它可以執行浮點數運算并應用一些高級函數。
#! /bin/bash# shell script -- test9.sh
# 通過shell進行數學運算
# Spring 2015-04-22no1=4
no2=5
let result=no1+no2
echo $result #9
let result++
echo $result #10
let result+=5
echo $result #15ret=$[ no1 + no2 ]
echo $ret #9ret=`expr 3 + 4`
ret=$(expr $ret + 5)
echo $ret #12ret=$[ $no1 + 6 ]
echo $ret #10ret=$(( no1 + 16 ))
echo $ret #20no=54
result=`echo "$no * 1.5" | bc`
echo $result #81.0
文件描述符和重定向:它是與文件輸入、輸出相關聯的整數。它們用來跟蹤已打開的文件。最常見的文件描述符是stdin、stdout、stderr。我們可以將某個文件描述符的內容重定向到另一個文件描述符中。文件描述符是與一個打開的文件或數據流相關聯的整數。文件描述符0(stdin,標準輸入)、1(stdout,標準輸出)、以及2(stderr,標準錯誤)是系統預留的。
當使用重定向操作符時(“>”、”>>”),當使用重定向操作符時,重定向的內容不會出現在終端,而是直接被導入文件。重定向操作符默認使用標準輸出。如果想使用特定的文件描述符,你必須將描述符置于操作符之前。
可以將stderr單獨重定向到一個文件,將stdout重定向到另一個文件,如:$cmd 2>stderr.txt 1>stdout.txt ;還可以利用下面的方法將stderr轉化成stdout,使得stderr和stdout都被重定向到同一個文件中,如:$ cmd 2>&1 output.txt 或 $ cmd &>output.txt
從stdin讀取輸入的命令能以多種方式接收數據。另外,還可以用cat和管道來制定我們自己的文件描述符。
我們可以使用exec命令創建自定義的文件描述符。
#! /bin/bash# shell script -- test10.sh
# 文件描述符的使用
# Spring 2015-04-22# 這種方法通過截取文件的方式,將輸出文本存儲到文件/home/spring/temp.txt中
# 在把echo命令的輸出寫入文件之前,temp.txt中的內容首先會被清空
echo "This is a sample text 1" > /home/spring/temp.txt# 這種方法會將文本追加到目標文件中
echo "This is a sample text 2" >> /home/spring/temp.txt# 重定向腳本內部的文本塊
cat <<EOF > /home/spring/log.txt
LOG FILE HEADER
This is a test log file
Function: System statistics
EOF
數組:它是shell腳本非常重要的組成部分,它借助索引將多個獨立的數據存儲為一個集合。Bash同時支持普通數組和關聯數組。普通數組只能使用整數作為數組索引,而關聯數組可以使用字符串作為數組索引。
定義數組的方法有很多種:可以在單行中使用一列值來定義一個數組;還可以將數組定義成一組索引--值。
關聯數組從Bash 4.0版本開始被引入。在關聯數組中,我們可以用任意的文本作為數組索引。而在普通數組中,只能用整數作為數組索引。
#! /bin/bash# shell script -- test11.sh
# 數組的使用
# Spring 2015-04-22array_var1=(1 2 3 4 5 6)
echo $array_var1 #1
echo ${array_var1[*]} #打印所以值array_var[0]="test1"
array_var[1]="test2"
array_var[2]="test3"
array_var[3]="test4"
array_var[4]="test5"
echo ${array_var[0]} #打印出特定索引的數組元素內容
index=3
echo ${array_var[$index]} #打印出特定索引的數組元素內容# 以清單形式打印出數組中的所有值
echo ${array_var[*]}
echo ${array_var[@]} #另一種方式echo ${#array_var[*]} #打印數組長度# 使用單獨的聲明語句將一個變量聲明為關聯數組
declare -A fruits_value
# 利用內嵌索引--值列表法或使用獨立的索引--值進行賦值
fruits_value=([apple]='100 dollars' [orange]='150 dollars')
echo "Apple costs ${fruits_value[apple]}"# 列出數組索引
echo ${!fruits_value[*]}
echo ${!fruits_value[@]} #另一種方法
使用別名:別名就是一種便捷方式,以省去用戶輸入一長串命令序列的麻煩。別名有多種實現方式,可以使用函數,也可以使用alias命令,如$ alias install=’sudo apt-get install’
alias命令的作用只是暫時的。一旦關閉當前終端,所有設置過的別名就失效了。為了使別名設置一直保持作用,可以將它加入~/.bashrc文件中。因為每當一個新的shell進程生成時,都會執行~/.bashrc中的命令。當你創建別名時,如果已經有同名的別名存在,那么原有的別名設置將被新的取代。
獲取終端信息:tput和stty是兩款終端處理工具。
獲取終端的行數和列數:$ tputcols ; $ tput lines ;
打印出當前終端名:$ tputlongname
獲取、設置日期和延時:我們能夠以多種格式打印日期,也可以在命令行中設置日期。在類UNIX系統中,日期被存儲為一個整數,其大小為自世界標準時間1970年1月1日0時0分0秒起所流逝的秒數。這種計時方式稱之為紀元時或UNIX時間。
#! /bin/bash -xv# shell script -- test12.sh
# 獲取、設置日期和延時
# Spring 2015-04-22date
date +%s# 將日期轉換成紀元時
date --date "Thu Nov 18 08:07:21 IST 2010" +%s# 獲知給定的日期是星期幾
date --date "Jan 20 2001" +%A# 用格式串結合 + 作為date命令的參數,可以按照你的選擇打印出對應格式的日期
date "+%d %B %Y"# 設置日期和時間
sudo date -s "21 June 2009 11:02:22" #需要有權限# 計算一組命令所花費的時間
start=$(date +%s)
# 執行相關命令......
sleep 5end=$(date +%s)
difference=$(( end - start ))
echo "Time taken to execute commands is $difference seconds"
調試腳本:
使用選項-x 啟動跟蹤調試shell腳本:$ bash -x script.sh 。運行帶有-x標志的腳本能打印出所執行的每一行命令以及當前狀態。
也可以巧妙的利用shebang來進行調試:把shebang從#! /bin/bash改成#!/bin/bash -xv,這樣一來,不用任何其它選項就可以啟用調試功能了。
???????? 函數:和其它腳本語言一樣,Bash同樣支持函數,函數同樣支持遞歸;函數也能像環境變量一樣用export導出。
???????? 讀取命令序列輸出:shell腳本可以將多個命令或工具組合起來生成輸出。一個命令的輸出可以作為另一個命令的輸入,而這個命令的輸出又會傳遞至另一個命令,依次類推。這種命令組合的輸出可以被存儲在一個變量中。這些命令被稱為過濾器(filter)。我們使用管道(pipe)來連接每一個過濾器。管道操作符是”|”。
???????? 利用子shell生成一個獨立的進程:子shell本身就是獨立的進程。可以使用()操作符來定義一個子shell。當命令在子shell中執行時,不會對當前shell有任何影響,所有的改變僅限于子shell內。
???????? read是一個重要的Bash命令,用于從鍵盤或標準輸入中讀取文本。可以使用read以交互的形式讀取來自用戶的輸入。
???????? 內部字段分隔符(InternalField Separator, IFS)是用于特定用途的定界符。IFS是存儲定界符的環境變量。它是當前shell環境使用的默認定界字符串。IFS的默認值為空白字符(換行符、制表符或者空格)。
#! /bin/bash# shell script -- test13.sh
# 演示IFS的用法
# Spring 2015-04-23line="root:0:0:0:ront:/root:/bin/bash"oldIFS=$IFS
IFS=":"
count=0for item in $line
do
[ $count -eq 0 ] && user=$item
[ $count -eq 6 ] && shell=$item
let count++
doneIFS=$oldIFS
echo $user\' s shell is $shell
???????? for循環:用法 for varin list; list可以是一個字符串或一個序列;也可以采用C語言中for循環的格式: for((i=0;i<10;i++))
???????? 比較:程序中的流程控制是由比較和測試語句來處理的。我們可以用if、if else以及邏輯運算符來執行測試,而用一些比較運算符來比較數據項。if和else語句可以進行嵌套。”&&”是邏輯與運算符,”||”是邏輯或運算符。條件通常被放置在封閉的中括號內。一定要注意在[或]與操作數之間有一個空格。如果忘記了這個空格,腳本就會報錯。
???????? 常用的操作符:(1)、”-eq”,等于;(2)、”-ne”,不等于;(3)、”-ge”,大于;(4)、”-lt”,小于;(5)、”-ge”,大于或等于;(6)、”-le”,小于或等于。
???????? 使用字符串比較時,最好用雙中括號,因為有時候采用單個中括號會產生錯誤。
???????? test命令可以用來執行條件檢測。用test有助于避免使用過多的括號。
shell常用命令
???????? cat命令:(1)、通常用于讀取、顯示或拼接文件內容;(2)、它還能夠從標準輸入中進行讀取,需要使用管道操作符”|”;(3)、還可以用cat將輸入文件的內容與標準輸入拼接在一起,也是通過管道操作符;(4)、還可以壓縮空白行(也可以用tr移除空白行),通過”-s”選項;(5)、它可以將制表符重點標記出來,通過”-T”選項;(6)、使用”-n”選項會在輸出的每一行內容之前加上行號。
???????? script和scriptreplay命令:可以把終端會話記錄到一個文件中,例如:
???????? (1)、開始錄制終端會話:$script -t 2> timing.log -a output.session??,退出錄制時在終端輸入exit并按回車鍵即可;
???????? (2)、回放命令執行過程:$scriptreplay? timing.log? output.session
???????? script命令同樣可以用于建立可在多個用戶之間進行廣播的視頻會話。
???????? find命令:沿著文件層次結構向下遍歷,匹配符合條件的文件,并執行相應的操作:
(1)、列出當前目錄及子目錄下所有的文件和文件夾:$ find /home/spring
(2)、根據文件名或正則表達式匹配搜索:$ find /home/spring -name? “*.txt”? ,”-iname”選項作用和”-name”類似,只不過在匹配名字的時候會忽略大小寫;
(3)、可以用”!”否定參數的含義:$find ?.?! ?-name? “*.txt” ,匹配所有不以.txt結尾的文件名;
???????? (4)、可以使用”-maxdepth”或”-mindepth”參數來限制find命令遍歷的深度:$find . -maxdepth 1 -type f ,只列出當前目錄下的所有普通文件,即使有子目錄,也不會被打印或遍歷;
???????? (5)、可以使用”-type”對文件搜索進行過濾,Linux文件具有不同的類型,例如普通文件(f)、目錄(d)、字符設備(c)、塊設備(b)、符號鏈接(l)、硬鏈接、套接字(s)以及FIFO(p)等:$ find . -type l ,只列出符號鏈接;
???????? (6)、根據文件時間進行搜索,每一個文件都有三種時間戳,訪問時間(-atime)、修改時間(-mtime)、變化時間(-ctime),它們可以整數值給出,單位是天,這些整數值通常還帶有-(小于)或+(大于):$ find . -type f -atime -2 -print ;打印出在最近2天內被訪問過的所有文件;還有其它一些基于時間的參數是以分鐘作為計量單位的,-amin、-mmin、-cmin;
???????? (7)、基于文件大小的搜索”-size”:$ find . -typef -size? +2k ,查找大于2KB的文件,除k之外,文件大小單元還可以用”c”(字節)、”M”(兆字節)等;
???????? (8)、刪除匹配的文件”-delete”:$ find . -typef -name “*.swp” -delete ,刪除當前目錄下所有的.swp文件。
???????? xargs命令:將標準輸入數據轉換成命令行參數,也可以將單行或多行文本輸入轉換成其它格式。xargs命令應該緊跟在管道操作符之后:
???????? (1)、將多行輸入轉換成單行輸出:$ cat example.txt? |? xargs
???????? (2)、將單行輸入轉換成多行輸出:$ cat example.txt? |xargs? -n?3 ,指定每行最大的參數數量n
???????? (3)、用find匹配并列出所有的.txt文件,然后用xargs將這些文件刪除:$find . -type f -name “*.txt” -print0? |xargs -0 rm -f
???????? (4)、統計源代碼目錄中所有C程序文件的行數:$find . -type f -name “*.c” -print0 | xargs -0 wc -l
???????? tr命令:可以對來自標準輸入的字符進行替換、刪除以及壓縮;它可以將一組字符變成另一組字符:
???????? (1)、將輸入字符有大寫轉換成小寫:$ echo “ABC DEF XYZ” | tr ‘A-Z’?‘a-z’
???????? (2)、通過”-d”刪除掉指定的字符:$cat test.txt | tr -d ‘0-9’ ,刪除test.txt中的數字
???????? 校驗和(checksum)程序用來從文件中生成校驗和密鑰,然后利用這個校驗和密鑰核實文件的完整性:
???????? (1)、md5sum命令:md5sum是一個32個字符的十六進制串,計算指定文件的md5摘要算法:$ md5sum test.txt? >test.md5
???????? (2)、sha1sum命令:它從給定的輸入文件中生成一個長度為40個字符的十六進制串:$ sha1sum test.txt > test.sha1
???????? sort命令:對文本文件和stdin進行排序操作。
???????? (1)、參數”-n”按數字進行排序,”-r”按逆序進行排序,”-M”按月份進行排序:$sort -n test.txt
???????? (2)、”-k”指定了排序應該按照哪一個鍵(key)來進行,鍵指的是列號,而列號就是執行排序時的依據:$ sort -nrk 1 data.txt
???????? split命令:可以指定分割大小,將文件分割成多個更小的文件
???????? (1)、”-b”分割大小,”-d”以數字為文件名后綴,”-a”指定后綴名長度:$split -b 10M data.file -d -a 4 , “-l”根據行數來分割文件
???????? 根據擴展名切分文件名:借助”%”操作符可以將名稱部分從”名稱.擴展名”這種格式的文件名中提取出來;借助”#”操作符將文件名的擴展名部分提取出來:filename=”sample.jpg”
???????? (1)、提取文件名:$ name=${filename%.*}
???????? (2)、提取擴展名:$extension=${filename#*.}
???????? rename命令:利用Perl正則表達式修改文件名。
#! /bin/bash# shell script -- test14.sh
# 文件重命名
# Spring 2015-04-24count=1;
for img in *.jpg *.bmp
do
new=image-$count.${img##*.}
mv "$img" "$new" 2> /dev/null
if [ $? -eq 0 ];
then
echo "Renaming $img to $new"
let count++
fi
done
?交互式輸入:是指只有當命令要求獲取輸入時,才由用戶手動鍵入。
#! /bin/bash# shell script -- test15.sh
# 交互式輸入
# Spring 2015-04-24read -p "Enter number:" no
read -p "Enter name:" name
echo You have entered $no, $name
文件操作:UNIX將操作系統中的一切都視為文件。目錄同樣是一種文件。
???????? 生成任意大小的文件用dd命令,$ ddif=/dev/zero of=junk.data bs=1M count=1 ,if代表輸入文件,of代表輸出文件。
???????? 兩個文件之間的比較可以使用comm命令,comm必須使用排過序的文件作為輸入。
???????? mkdir命令:用于創建目錄,$mkdir -p /home/spring/abc/def/xyz/opq
???????? 文件權限:通常包括三類權限,用戶,用戶組和其他用戶。用戶(user)是文件的所有者;用戶組(group)是多個用戶的集合,系統允許這些用戶對文件進行某些形式的訪問;其他用戶(others)是除用戶或用戶組之外的任何用戶。用命令$ ls -l可以列出文件的權限。可以參考http://blog.csdn.net/fengbingchun/article/details/45077575,可以通過chmod命令設置文件權限。可以使用chown命令更改文件的所有權。
???????? 創建不可修改文件可以使用chattr命令:
???????? (1)、將文件設置為不可修改:$sudo chattr +i test.txt
???????? (2)、移除文件不可修改屬性:$sudo chattr -i test.txt
???????? 批量生成空白文件可以使用touch命令。”-a”只更改文件訪問時間,”-m”只更改文件內容修改時間,”-d”指定特定的時間和日期。
#! /bin/bash# shell script -- test16.sh
# 批量生成空白文件
# Spring 2015-04-24for name in {1..10}.txt
do
touch -d "Fri Jun 25 20:50:14 IST 1999" $name
done
? ? ? ? 符號鏈接:只不過是指向其它文件的指針,它在功能上類似于Mac OS中的別名或Windows中的快捷方式。刪除符號鏈接不會影響到原始文件。創建一個符號鏈接:$ ln -s /bin/bash ~/feng_sh
???????? 列舉文件類型統計信息可以通過file命令。
#! /bin/bash# shell script -- test17.sh
# 統計文件類型信息
# Spring 2015-04-24if [ $# -ne 1 ]
then
echo $0 basepath
echo
fi
path=$1declare -A statarray
while read line
do
ftype=`file -b "$line"`
let statarray["$ftype"]++
done< <(find $path -type f -print)echo ====== File types and counts ======
for ftype in "${!statarray[@]}"
do
echo $ftype : ${statarray["$ftype"]}
done? ? ? ? ?查找文件差異可以通過diff命令,$ diff -utest1.txt test2.txt > test.patch
???????? 打印文件的指定行數可以使用head和tail命令:
???????? (1)、打印文件前5行:$ cattest.txt | head -n 5
???????? (2)、打印文件最后5行:$ cattest.txt | head -n 5
???????? 只列出目錄的方法:
???????? (1)、$ ls -d */
???????? (2)、$ ls -F |grep “/$”
???????? (3)、$ ls -l |grep “^d”
???????? (4)、$ find .-type d -maxdepth 1 -print
???????? 在多個目錄之間進行切換可以使用pushd和popd命令。pushd總是將路徑添加到棧,如果要從棧中刪除路徑,可以使用popd。當涉及3個以上的目錄時,可以使用pushd和popd。但是當只涉及兩個位置的時候,還有另一個更簡便的方法:$ cd -
???????? 統計文件的行數、單詞數和字符數可以使用wc命令,Word Count的縮寫:
???????? (1)、統計行數:$ cattest.txt | wc -l
???????? (2)、”-w”參數用于統計單詞數,”-c”參數用于統計字符數
???????? 打印目錄樹結構可以使用tree命令:$ tree/home/spring
文本處理
???????? 正則表達式是一種用于文本匹配的通用語言。
???????? 在文件中搜索文本使用grep命令,它能夠支持正則表達式和通配符:”--color”參數可以在輸出行中重點標記出匹配到的單詞;”-E”參數支持擴展正則表達式;”-c”統計文件或文本中包含匹配字符串的行數;”-i”可以使匹配樣式不考慮字符的大小寫;”-e”來指定多個匹配樣式。
???????? 按列切分文件可以使用cut命令,顯示第2列和第3列的內容:$ cut -f2,3 test.txt ,要打印多列,需要提供一個由逗號分隔的列號列表作為-f選項的參數。
???????? sed命令是streameditor(流編輯器)的縮寫,它可以進行文本替換:$ cat test.txt | sed ‘s/a/A/g’ > tt.txt,可以通過”-i”參數,將替換結果應用于原文件。也可以使用雙引號,當使用雙引號時,可以在sed樣式和替換字符串中指定變量。
???????? awk命令用于數據流,它可以對列和行進行操作
???????? 按列合并文件:可以用paste命令實現按列拼接,而cat命令所實現的拼接通常是按照行來進行的:$ paste test1.txt test2.txt ,默認的定界符是制表符,也可以用”-d”明確指定定界符。
???????? 以逆序形式打印行,可以通過tac命令:$ tac test.txt。
???????? 解析文本中的電子郵件地址和URL可以通過egrep命令。
Web應用
???????? wget命令:可以下載網頁或遠程文件:$ wget ?http://blog.csdn.net/fengbingchun
???????? curl命令可以用來執行下載、發送各種HTTP請求、指定HTTP頭部等操作。
歸檔與壓縮
???????? tar命令:可以用來歸檔文件,它可以將多個文件和文件夾保存為單個文件,同時還能保留所有的文件屬性,如所有者、權限等:
???????? (1)、$ tar -cfoutput.tar 1.txt 2.txt ,”-c”代表創建文件(create file),”-f”代表指定文件名(specify filename),可以使用文件名列表或者諸如*.txt這類通配符來指定文件夾和文件名,文件名必須緊跟在”-f”之后,并且”-f”應該是參數組中的最后一項
???????? (2)、向歸檔文件中添加文件:$tar -rvf output.tar 3.txt ,”-r”追加選項
???????? (3)、列出歸檔文件中的內容:$tar -tvf output.tar ,需要在歸檔或列出歸檔內容的過程中獲知更多細節,可以使用”-v”或”-vv”選項
???????? (4)、從歸檔文件中提取文件或文件夾:$ tar -xf output.tar ,選項”-x”表示提取(exact),可以用選項”-C”指定需要將文件提取到哪個目錄
???????? (5)、拼接兩個歸檔文件:$tar -Af file1.tar file2.tar ,將file2.tar的內容合并到file1.tar中
???????? (6)、通過檢查時間戳來更新歸檔文件中的內容,通過選項”-u”,只有比歸檔文件中的同名文件更新的時候才進行添加:$ tar -uvvf file.tar? 1.txt
???????? (7)、比較歸檔文件與文件系統中的內容,選項”-d”可以打印出兩者之間的差別:$ tar -df file.tar 1.txt
???????? (8)、從歸檔文件中刪除文件,使用”--delete”選項:$ tar -f file.tar --delete 1.txt
???????? (9)、使用”--totals”選項可以在歸檔完成之后打印出總歸檔字節數:$ tar -cf file.tar *.txt --totals
???????? cpio命令是類似于tar的另一種歸檔格式,它用來將多個文件和文件夾存儲為單個文件,同時還能保留所有的文件屬性,如權限、文件所有權等。
???????? gzip命令:只能夠壓縮單個文件,而無法對目錄和多個文件進行歸檔
???????? (1)、$ gzip 1.txt,gzip會刪除原文件并生成一個壓縮文件1.txt.gz;將gzip文件解壓縮的方法是:$ gunzip 1.txt.gz ,會刪除1.txt.gz并生成1.txt
???????? (2)、壓縮歸檔文件,可以用tar命令的”-z”選項:$ tar-czvvf file.tar.gz? *.txt
???????? (3)、提取經由gzip壓縮的歸檔文件中的內容:$tar -xavvf file.tar.gz -C /home/spring ,”-x”用于提取內容,”-a”用于自動檢測壓縮格式
???????? bzip2命令:通常能夠生成比gzip更小(壓縮比更高)的文件
???????? (1)、$ bzip21.txt ,bzip2會刪除原文件并生成一個壓縮文件1.txt.bz2;將bzip2文件解壓縮的方法是:$ bunzip2 1.txt.bz2 ,會刪除1.txt.bz2并生成1.txt
???????? (2)、通過”-j”選項將bzip2與歸檔文件結合使用:$tar -cjvvf file.tar.bz2 *.txt
???????? (3)、選項”-k”避免刪除輸入文件:$bunzip2 file.bz2 -k
???????? lzma命令:它提供了比gzip或bzip2更好的壓縮率:$ lzma1.txt ,會生成1.txt.lzma并刪除1.txt文件,解壓縮lzma文件,用unlzma命令
???????? zip命令:$ zipfile.zip 1.txt ,與lzma、gzip以及bzip2不同的是,zip在完成壓縮之后不會刪除原文件,要從zip文件中提取內容:$ unzip file.zip
???????? crypt命令:一個簡單的加解密工具
???????? (1)、加密:$ crypt<1.txt>2.txt ,1.txt為需要加密的文件,2.txt為加密后的文件
???????? (2)、解密:$ cryptpassword -d <2.txt>3.txt ,password為2.txt的密鑰,3.txt為2.txt解密后生成的文件
???????? gpg命令:采用密鑰簽名技術保護文件內容,只有經過認證的用戶才能訪問數據
???????? (1)、加密:$ gpg -c1.txt ,輸入密碼后,會生成1.txt.gpg文件
???????? (2)、解密:$ gpg1.txt.gpg ,彈出對話框,輸入密碼后即可解密
???????? base64命令:是一組類似的編碼方案,它通過將ASCII字符轉換成以64為基數的形式來用ASCII字符串描述二進制數據
???????? (1)、編碼為Base64格式:$ base641.txt > 2.txt
???????? (2)、解密Base64格式:$ base64-d 2.txt > 3.txt
???????? rsync命令:可以對位于不同位置的文件和目錄進行備份,它可以借助差異計算以及壓縮技術來最小化數據傳輸量
???????? (1)、將源目錄復制到目的端(創建鏡像):$ rsync -av/home/spring/1 /home/spring/2 ,”-a”表示要進行歸檔,”-v”表示在stdout上打印出細節信息或進度
???????? (2)、可以通過”-z”選項指定在網絡傳輸時使用數據壓縮
???????? 用Git備份版本控制
???????? dd命令:它能夠用于克隆任何類型的磁盤,如硬盤、閃存、CD、DVD以及軟盤等。
網絡相關
???????? ifconfig命令:用于顯示網絡接口、子網掩碼等詳細信息
???????? (1)、打印網絡接口列表:$ifconfig | cut -c-10 | tr -d ‘ ‘ | tr -s ‘\n’
???????? (2)、提取IP地址:$ ifconfigeth0 | egrep -o “inet addr:[^ ]*” | grep -o “[0-9.]*”
???????? ping命令:是一個驗證網絡上兩臺主機連通性的診斷工具,能夠用來找出網絡上的活動主機
系統安全及管理
???????? 統計磁盤的使用情況使用df(diskfree)和du(disk usage)命令:
???????? (1)、計算某個文件(或多個文件)占用的磁盤空間:$ du1.txt 2.txt
???????? (2)、獲得指定目錄中所有文件的磁盤使用情況:$ du -a /home/spring
???????? (3)、計算所有文件或目錄總共占用的磁盤空間:$ du -c /home/spring
???????? (4)、選項”-h”可以以KB、MB顯示文件大小;選項”-s”只輸出合計數據
???????? (5)、df命令提供磁盤可用空間信息
???????? 監視程序執行所需要的時間可以使用time命令:$ time ls ,real時間指的是掛鐘時間,也就是命令從開始執行到結束的時間;user時間是指進程花費在用戶模式重的CPU時間,這是唯一用于執行進程所花費的時間;sys時間是指進程花費在內核模式中的CPU時間,它代表在內核中執行系統調用所使用的時間。
???????? 要獲取當前登錄用戶的相關信息,可以使用who或w命令。
???????? 要列出當前登錄主機的用戶列表,可以使用users命令。
???????? 要查看系統已經通電運行了多少時間,可以使用uptime命令。
???????? 要獲取前一次的啟動及用戶登錄會話的信息,可以使用last命令。
???????? ps命令用于收集系統中進程的詳細信息。
???????? watch命令可以用來在終端中以固定的間隔監視命令輸出。
???????? top命令默認會輸出一個占用CPU最多的進程列表。
???????? kill命令可用來向進程發送信號,而trap命令用來處理所接收的信號。
???????? which命令用來找出某個命令的位置:$ which ls
???????? whereis與which命令類似,但是它不僅返回命令的路徑,還能夠打印出其對應的命令手冊的位置以及命令源代碼的路徑(如果有的話)
???????? file命令用來確定文件的類型:$file /bin/ls
???????? whatis命令會輸出作為參數的命令的簡短描述信息:$ whatis ls
???????? wall命令用來向所有當前登錄用戶的終端寫入消息。它可以將消息傳遞給一臺服務器中所有的當前登錄用戶或是多臺分散主機中的用戶。
???????? 打印當前系統的主機名使用hostname命令或$ uname -n。
???????? 打印Linux內核版本、硬件架構等詳細信息用:$ uname -a
???????? 打印Linux內核發行版本:$uname -r
???????? 打印主機類型:$uname -m
???????? 打印出CPU相關信息:$ cat/proc/cpuinfo
???????? 獲取處理器名稱:$ cat/proc/cpuinfo | head -n 5 | tail -1
???????? 打印內存詳細信息:$cat /proc/meminfo
???????? 打印系統可用內存總量:$cat /proc/meminfo | head -1
???????? 列出系統的分區信息:$cat /proc/partitions
???????? 獲取系統的詳細信息:$sudo lshw
???????? 用/proc收集信息:在Linux操作系統中,/proc是一個位于內存中的偽文件系統,它的引入是為了提供一個可以從用戶空間讀取系統參數的接口。我們能夠從中收集到大量的系統信息。
???????? 用cron命令進行調度:它通過守護進程cron使得任務能夠以固定的時間間隔在系統后臺自動運行。
? ? ? ??
???????? 以上內容整理自《Linux Shell腳本攻略》
GitHub:https://github.com/fengbingchun/Linux_Code_Test
總結
以上是生活随笔為你收集整理的Shell脚本基础介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Makefile语法基础介绍
- 下一篇: 有效的rtsp流媒体测试地址汇总