Linux Shell編程基礎!

這是我參與 8 月更文挑戰的第 10 天,活動詳情查看: 8月更文挑戰web

簡介

Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程序設計語言。Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶經過這個界面訪問操做系統內核的服務。同時,Bash 也是大多數Linux 系統默認的 Shellshell

基礎使用

可執行文件的執行方式,注意文件開頭#!/bin/bashapi

輸出重定向

符號 說明
命令 > 文件 以覆蓋的方式把命令的正確輸出結果保存在文件中
命令 >> 文件 以追加的方式把命令的正確輸出結果保存在文件中
命令 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 #進入根路徑再執行ll
make && make install #只有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'  沒有特殊意義
#$x 
echo "$x"  擁有特殊意義
#1

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  #bash執行文件
$0 ==>  default_var.sh
$1 ==>  a
$2 ==>  b
$# ==>  4
$@ ==>  a b c d
$* ==>  a b c d
$? ==>  0 #0表明正常執行
複製代碼

局部變量

局部變量在腳本或命令中定義,僅在當前shell實例中有效,其餘shell啓動的程序不能訪問局部變量。調用變量要加$符號,注意等號左右不能有空格。markdown

x=1
readonly x  定義只讀變量
echo $x  #1
set 查看全部變量
unset 刪除變量
複製代碼

環境變量

全部的程序,包括shell啓動的程序,都能訪問環境變量,有些程序須要環境變量來保證其正常運行。必要的時候shell腳本也能夠定義環境變量。通常環境變量都是大寫,便於區分。環境變量好比PATHHOME等。通常是在/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
#abcdef
printf "%s %s %s\n" a b c d e f g h i j
#a b c
#d e f
複製代碼

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 $?  #查看上一條命令執行狀態,0爲正常執行

[ -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經常使用模塊的用法

服務器硬件指南!

相關文章
相關標籤/搜索