這是我參與 8 月更文挑戰的第 10 天,活動詳情查看: 8月更文挑戰web
簡介
Shell
是一個用 C 語言編寫的程序,它是用戶使用 Linux
的橋樑。Shell
既是一種命令語言,又是一種程序設計語言。Shell
是指一種應用程序,這個應用程序提供了一個界面,用戶經過這個界面訪問操做系統內核的服務。同時,Bash
也是大多數Linux
系統默認的 Shell
。shell
基礎使用
可執行文件的執行方式,注意文件開頭#!/bin/bash
api
輸出重定向
符號 |
說明 |
命令 > 文件 |
以覆蓋的方式把命令的正確輸出結果保存在文件中 |
命令 >> 文件 |
以追加的方式把命令的正確輸出結果保存在文件中 |
命令 2> 文件 |
以覆蓋的方式把命令輸出的錯誤信息保存在文件中 |
命令 2>> 文件 |
以追加的方式把命令輸出的錯誤信息保存在文件中 |
命令 &> 文件 |
以覆蓋的方式把全部的信息保存在同一個文件中 |
命令 &>> 文件 |
以追加的方式把全部的信息保存在同一個文件中 |
命令 > 文件 2>&1 |
以覆蓋的方式把全部的信息保存在同一個文件中 |
命令 >> 文件 2>&1 |
以追加的方式把全部的信息保存在同一個文件中 |
命令 >> 文件1 2>> 文件2 |
把正確信息追加到文件1 錯誤信息追加到文件2 |
ll > file 把ll命令正確的輸出結果保存在file文件中
ll >> file 把ll命令正確的輸出結果追加在file文件的最後
ll &>> file 把ll命令執行的全部結果追加在file文件的最後
ll &>> /dev/null 把ll命令的結果都捨棄 /dev/null至關於一個黑洞
複製代碼
輸入重定向
統計文件中的字符數,分別是行數,單詞數,字節數安全
wc < file
複製代碼
多命令順序執行
格式 |
說明 |
命令1 ; 命令2 |
多個命令順序執行,命令之間沒有關聯 |
命令1 && 命令2 |
命令1正確執行,命令2纔會執行 |
命令1 || 命令2 |
命令1執行不正確,命令2纔會執行 |
命令1 | 命令2 |
命令1的正確執行做爲命令2的操做對象 |
cd / ; ll
make && make install
cd /test || echo 'not find'
ll | grep test
複製代碼
經常使用符號
通配符 |
說明 |
? |
匹配一個任意字符 |
* |
匹配任意內容 |
[] |
匹配括號中的任意一個字符 例如:[a,b],匹配a或b其中一個字符 |
[-] |
匹配一個範圍內的一個字符 例如:[a-z],匹配a到z其中一個字符 |
[^] |
匹配一個非括號內的字符 例如:[^0-9],匹配不是0到9的字符 |
rm -rf /* 刪除全部文件 跑路必備
find -name *.rc?
複製代碼
符號 |
說明 |
' ' |
單引號 在單引號中的特殊符號沒有特殊意義 |
" " |
雙引號 在雙引號中的特殊符號有特殊意義 |
`` |
反引號 用於執行系統命令 |
$() |
也是用於執行系統命令 |
$ |
調用變量 |
# |
註釋 |
\ |
轉義字符 |
x=1
echo '$x' 沒有特殊意義
echo "$x" 擁有特殊意義
time = `date` 執行系統命令
time = $(date) 一樣是執行系統命令
echo time 輸出對應時間
複製代碼
read 讀取鍵盤輸入的值
read命令從鍵盤讀取變量的值而後保存在指定變量,一般用在shell腳本中與用戶進行交互的場合。bash
選項 |
說明 |
-p |
指定讀取值時的提示文字 |
-t |
指定讀取值時等待的時間(秒) |
-n |
設定輸入的字符數 |
-s |
隱藏輸入信息 |
#!/bin/bash
read -p "輸入密碼:" -s pwd
echo $pwd
複製代碼
數值運算
可使用$(())
或$[]
進行數值的運算服務器
sum=$(($1+$2))
sum=$[$1+$2]
複製代碼
變量置換
變量置換方式 |
變量y沒有設置 |
變量y爲空值 |
變量y設置值 |
x=${y-新值} |
x= 新值 |
x 爲空 |
x=$y |
x=${y:-新值} |
x= 新值 |
x= 新值 |
x=$y |
x=${y+新值} |
x 爲空 |
x= 新值 |
x=新值 |
x=${y:+新值} |
x 爲空 |
x 爲空 |
x=新值 |
x=${y=新值} |
x= 新值 |
x 爲空 |
x=$y |
y= 新值 |
y 值不變 |
y值不變 |
|
x=${y:=新值} |
x= 新值 |
X= 新值 |
x=$y |
y= 新值 |
y= 新值 |
y值不變 |
|
x=${y?新值} |
新值輸出到標準錯誤輸出(屏幕) |
x 爲空 |
x=$y |
x=${y:?新值} |
新值輸出到標準錯誤輸出 |
新值輸出到標準錯誤輸出 |
x=$y |
變量
默認變量
變量 |
含義 |
$0 |
當前腳本名稱 |
$1 |
腳本接收的第一個參數 |
$2 |
腳本接收的第二個參數 |
$# |
腳本接收的全部參數個數 |
$@ |
腳本接收的全部參數 |
$* |
腳本接收的全部參數 把全部變量當成一個總體 |
$? |
前一行命令的執行狀態 |
$$ |
顯示當前進程的進程號 |
$! |
顯示後臺最後一個進程號 |
bash test.sh a b c d
$0 ==> default_var.sh
$1 ==> a
$2 ==> b
$# ==> 4
$@ ==> a b c d
$* ==> a b c d
$? ==> 0
複製代碼
局部變量
局部變量在腳本或命令中定義,僅在當前shell實例中有效,其餘shell啓動的程序不能訪問局部變量。調用變量要加$符號,注意等號左右不能有空格。markdown
x=1
readonly x 定義只讀變量
echo $x
set 查看全部變量
unset 刪除變量
複製代碼
環境變量
全部的程序,包括shell
啓動的程序,都能訪問環境變量,有些程序須要環境變量來保證其正常運行。必要的時候shell
腳本也能夠定義環境變量。通常環境變量都是大寫,便於區分。環境變量好比PATH
,HOME
等。通常是在/etc/profile
, 設置完成以後時候須要使用source /etc/profile
使環境變量生效網絡
export NAME=test 定義環境變量
env 查看環境變量
echo $PATH 查看環境變量
echo $HOME
複製代碼
declare 申明變量類型
選項 |
說明 |
- |
可用來指定變量的屬性 |
+ |
取消變量所設的屬性 |
-i |
將變量設置爲整數型 |
-x |
指定的變量會成爲環境變量,可供shell之外的程序來使用 |
-p |
顯示指定變量的聲明類型 |
declare - i sum=$1+$2
複製代碼
基礎語法
echo 打印輸出
echo test 直接打印出test
echo test > file 將打印內容寫入文件
複製代碼
printf 格式化打印
格式替代符 |
說明 |
%ns |
輸出n個字符串 |
%ni |
輸出n個數字 |
%m.nf |
輸出浮點數 指代輸出的整數位數和小數位數 例如%8.2f,表明共輸出8位,其中2位小數,6位整數 |
序列 |
說明 |
\a |
發出警告音 |
\b |
後退 |
\f |
換頁(formfeed) |
\n |
換行 |
\r |
回車(Carriage return) |
\t |
水平製表符 |
\v |
垂直製表符 |
printf %s abcdef
printf "%s %s %s\n" a b c d e f g h i j
複製代碼
cut 提取列
選項 |
說明 |
-f |
截取指定列 |
-d |
-d:指定字段的分隔符,默認的字段分隔符爲「TAB」; |
cut -d ':' -f 1 /etc/passwd
複製代碼
test 條件判斷
選項 |
說明 |
-e |
判斷文件是否存在 |
-d |
若是文件爲一個目錄,則爲真 |
-f |
若是文件爲一個普通文件,則爲真 |
-L |
判斷文件是否存在,而且要爲連接文件 |
-z |
判斷變量是否爲空 |
-a |
多重判斷 |
-r |
判斷文件是否有讀權限 |
-w |
判斷文件是否有寫權限 |
-x |
判斷文件是否有執行權限 |
test -f file
[ -f file ]
echo $?
[ -f file ] && echo "文件存在" || echo "文件不存在"
[ -z "$name" ] && echo "變量爲空" || echo "變量不爲空"
[ "$x" == "$y"] && echo "兩個變量相等" || echo "兩個變量不相等"
[ -f file -a -w file ]
複製代碼
流程控制
if 判斷
if [ $a == $b ]
then
echo "a 等於 b"
elif [ $a -gt $b ]
then
echo "a 大於 b"
elif [ $a -lt $b ]
then
echo "a 小於 b"
else
echo "沒有符合的條件"
exit 1
fi
if [ $a == $b ]; then
fi
複製代碼
case 多選擇判斷
read -p "請輸入數字" Num
case $Num in
1) echo '你選擇了 1'
;;
2) echo '你選擇了 2'
;;
3) echo '你選擇了 3'
;;
4) echo '你選擇了 4'
;;
*) echo '你沒有輸入 1 到 4 之間的數字'
;;
esac
複製代碼
for循環
遍歷數字
for num in 1 2 3
do
echo "The value is: $num"
done
遍歷字符串
for str in 'This is a string'
do
echo $str
done
打印根目錄全部文件
ls / > /root/file.log
for i in $(cat file.log)
do
echo $i
done
常規for循環
for ((i=0;i<10;i=i+1))
do
echo $i
done
複製代碼
while循環
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
複製代碼
until 循環
until
循環執行一系列命令直至條件爲 true
時中止。框架
until
循環與 while
循環在處理方式上恰好相反。運維
int=1
until(( $int>=5 ))
do
echo $int
let "int++"
done
複製代碼
推薦閱讀
Linux sudo和sudoers詳解!
Linux TCP內核參數設置與調優(詳細)!
運維必定要知道的Linux RAID詳解!
Linux服務管理(詳解)!
網絡安全人員必定要知道的Metasploit滲透框架!
滲透必備-Metasploit經常使用模塊的用法
服務器硬件指南!