shell編程基礎

  • shell使用戶與Linux操作系統(tǒng)之間溝通的橋梁,用戶可以通過輸入命令執(zhí)行,又可以利用shell腳本編程去運行
  • Linux shell種類
    • bourne shell(usr/bin/sh或/bin/sh)
    • bourne again shell(/bin/bash)
    • C shell(/usr/bin/csh)
    • K shell(/usr/bin/ksh)
    • shell for root(/sbin/sh)
  • 不同的shell語言的語法有所不同,一般不能交換使用,最常用的shell是bash,也就是bourne again shell(/bin/bash).bash由于易用和免費,是大多數(shù)操作系統(tǒng)默認的shell環(huán)境
  • 簡單來說,shell是一個整體的概念,shell編程與shell腳本統(tǒng)稱為shell編程,shell命令是shell編程底層具體的語句和實現(xiàn)方法

shell腳本及Hello World

  • shell腳本編程注意事項:
    • shell腳本名稱命名一般為英文的大寫、小寫
    • 不能使用特殊符號、空格來命名
    • shell腳本后綴以.sh結尾
    • 不建議shell命名為純數(shù)字,一般以腳本功能命名
    • shell腳本內容首行需要以#!/bin/bash開頭
    • shell腳本中變量名稱盡量使用大寫字母,字母間不可以使用"-",可以使用"_"
    • shell腳本變量名稱不能以數(shù)字、特殊符號開頭
  • 第一個shell編程腳本,腳本名稱為first_shell.sh
    • !bin/bash:固定格式,定義該腳本所使用的的shell類型

    • # This is my First shell:#表示注釋,沒有任何意義,shell不會解析
    • echo "Hello World":shell腳本主命令,執(zhí)行該腳本所呈現(xiàn)的內容
#!bin/bash
# This is my First shell
echo "Hello World"
  • shell腳本編寫完畢,如果運行該腳本,運行用戶需要有執(zhí)行權限,可以使用chomd o+x first_shell.sh賦予可執(zhí)行權限.然后./first_shell.sh執(zhí)行即可,還可以使用命令/bin/sh first_shell.sh直接運行腳本,不需要執(zhí)行權限,最終執(zhí)行顯示效果一樣

shell編程之變量

  • shell屬于非類型的解釋型語言,在使用變量時不像C++、JAVA語言編程時需要事先聲明變量,shell給一個變量賦值,實際上就是定義了變量,在Linux支持的所有shell中,都可以用賦值符合"="為變量賦值,shell為弱類型語言,定義變量不需要聲明變量類型,如果在使用時需要明確變量的類型,可以使用declare指定類型,declare常見參數(shù)如下:
    • +/-:"-"可以用來指定變量的屬性,"+"為取消變量所設的屬性
    • -f:僅顯示函數(shù)
    • r:將變量設置為只讀
    • x:指定的變量會變?yōu)榄h(huán)境變量,可供shell以外的程序來使用
    • i:指定類型為數(shù)值,字符串或運算式
  • shell編程中變量分為3種:系統(tǒng)變量、環(huán)境變量、用戶變量,其中系統(tǒng)變量在對參數(shù)判斷和命令返回值判斷時使用,而環(huán)境變量則主要是在程序運行時需要設置,用戶變量又稱為局部變量,多使用在shell腳本內部或者臨時局部
  • shell變量名在定義時,首個字符必須為(a-z,A-Z),不能以數(shù)字開頭,中間不能有空格,可以使用下劃線"_",不能使用"-",也不能使用標點符號等
  • 例如定義變量A=apple,定義這樣一個變量,A為變量名,apple是變量的值,變量名有規(guī)范格式,變量的值可以隨意指定.變量定義完成,如需要引用變量,可以使用$A
#!bin/bash
A=apple
echo "這個變量的值是$A"

# 執(zhí)行該腳本,顯示的結果為-------這個變量的值是apple
  • shell常見的系統(tǒng)變量、環(huán)境變量、用戶變量
    1. 系統(tǒng)變量
      • $0:當前腳本名稱
      • $n:當前腳本的第n個參數(shù)
      • $*:當前腳本的所有參數(shù)(不包括程序本身)
      • $#:當前腳本的參數(shù)個數(shù)(不包括程序本身)
      • $?:命令或程序執(zhí)行完后的狀態(tài),返回0表示執(zhí)行成功
      • $$:程序本身的PID號
    2. 環(huán)境變量
      • PATH:命令所示路徑,以冒號為分割
      • HOME:打印用戶家目錄
      • SHELL:顯示當前shell類型
      • USER:打印當前用戶名
      • ID:打印當前用戶ID信息
      • PWD:顯示當前所在路徑
      • TERM:打印當前終端類型
      • HOSTNAME:顯示當前主機名
    3. 用戶變量
      • A=apple

if條件語句

  • if條件判斷語句,通常以if開頭,fi結尾.也可以加入else或者elif進行多條件的判斷,if表達式如下
if (表達式)
    語句1
else
    語句2
fi
  • 比較兩個整數(shù)大小
#!/bin/bash
NUM=100
if (( $NUM>4 ));then
    echo "數(shù)字$NUM大于4"
else
    echo "數(shù)字$NUM小于4"
fi
  • 判斷系統(tǒng)目錄是否存在
#!/bin/bash
if [ ! -d /data/0326 ];then
    mkdir -p /data/0326
else
    echo '目錄或文件已存在'
fi
  • if常見的判斷邏輯運算符

    • -f:判斷文件是否存在,例如if[-f filename]
    • -d:判斷目錄是否存在,例如if[-d dir]
    • -eq:等于,應用于整型比較,即equal
    • -ne:不等于,應用于整型比較,即not equal
    • -lt:小于,應用于整型比較,即letter
    • -gt:大于,應用于整型比較,即greater
    • -le:小于等于,應用于整型比較
    • -ge:大于等于,應用于整型比較
    • -a:雙方都成立(and),用法為邏輯表達式-a
    • -o:單方成立(or),用法為邏輯表達式-o
    • -z:空字符串
    • ||:單方成立
    • &&:雙方都成立表達式
  • 多條件判斷

#!/bin/bash
scores=$1
if [[ $scores -eq 100 ]];then
    echo "very good"
elif [[ $scores -gt 85 ]];then
    echo "good"
elif [[ $scores -gt 60 ]];then
    echo "pass"
else
    echo "no pass"
fi

if判斷括號區(qū)別

  • ():用于多個命令組、命令替換、初始化數(shù)組
  • (()):整數(shù)擴展、運算符、重定義變量值、算術運算比較
  • []:bash內部命令,"["與test是等同的,正則字符范圍、引用數(shù)組元素編號,不支持"+"、"-"、"*"、"/"數(shù)學運算符,邏輯測試使用-a、-o
  • [[]]:bash程序語言的關鍵字,不是一個命令,[[]]結構比[]結構更加通用,不支持"+"、"-"、"*"、"/"數(shù)學運算符,邏輯測試使用&&、||
  • {}:主要用于命令集合或者范圍,例如mkdir -p /data{1..10}

MySQL數(shù)據(jù)庫備份腳本

#!/bin/bash
# auto backup mysql
BAK_DIR=/data/backup/mysql/`date +%F`
MYSQLDB=test
NYSQLPW=123456
MYSQLUSR=root
# must use root user run scripts 必須使用root用戶運行,$UID為系統(tǒng)變量
if [ $UID -ne 0 ];then
    echo "This script must use the root user "
    sleep 2
    exit 0
fi
# Define DIRand mkdir 判斷目錄是否存在,不存在則創(chuàng)建
if [ ! -d $BAK_DIR ];then
    mkdir -p $BAK_DIR
fi
# Use mysqldump backup Databases
/usr/local/mysql/bin/mysqldump -u$MYSQLUSR -p$NYSQLPW -d $MYSQLDB > $BAK_DIR/db.sql
echo "The mysql backup successfully"

for循環(huán)語句

  • for循環(huán)語句主要用于對某個數(shù)據(jù)域進行循環(huán)讀取、對文件進行遍歷,通常用于循環(huán)某個文件或者列表.其語法格式以for...do開頭,done結尾
for var in (表達式);do
    語句
done
  • 循環(huán)打印1-100數(shù)字,seq表示列出數(shù)據(jù)范圍
#!/bin/bash
for num in `seq 1 10`;do
    echo $num
done
  • for循環(huán)求1-100的和
#!/bin/bash
SUM=0
for (( i=1;i<=100;i++ ));do
    SUM=`expr $i + $SUM`
done
echo $SUM
  • 對系統(tǒng)日志文件進行打包
#!/bin/bash
for i in `find /var/log -type f -name '*.log'`;do
    tar zcf `date +%F`.tar.gz $i
done
  • for循環(huán)批量遠程主機文件傳輸
#!/bin/bash
for i in `seq 100 200`;do
    scp -r /tmp/file.txt root@10.0.0.$i:/data
done
  • for循環(huán)批量遠程主機執(zhí)行命令
#!/bin/bash
for i in `seq 100 200`;do
    ssh -l root 10.0.0.$i 'ls /opt'
done
  • for循環(huán)打印10s等待提示
#!/bin/bash
for (( i=1;i<=10;i++ ));do
    echo -ne "\033[32m-\033[0m"
    sleep 1
done
echo

while循環(huán)語句

  • while循環(huán)語句與for循環(huán)功能類似,主要用于對某個數(shù)據(jù)域進行循環(huán)讀取、對文件進行遍歷,通常用于循環(huán)某個文件或者列表,滿足循環(huán)條件會一直循環(huán),不滿足則退出循環(huán),其語法格式以while...do開頭,done結尾
while (表達式);do
    語句
done
  • 循環(huán)打印文件中的域名
cat test.txt 
www.baidu.com
www.ali.com
www.qq.com

vim pra.sh
#!/bin/bash
while read line;do
    echo $line
done < test.txt
  • while無限每秒輸出Hello World
#!/bin/bash
while sleep 1;do
    echo -e "\033[32mHello World.\033[0m"
done
  • 循環(huán)打印1-100數(shù)字,expr用于邏輯運算
#!/bin/bash
i=1
while (( i<=100 ));do
    echo $i
    i=`expr $i + 1`
done
  • while循環(huán)求1-100的和
#!/bin/bash
NUM=1
SUM=0
while (( NUM<=100 ));do
    SUM=`expr $NUM + $SUM`
    (( NUM++ ))
done
echo $SUM
  • while逐行讀取文件
#!/bin/bash
while read line;do
    echo $line
done < /root/test/test.txt
  • 每5秒判斷/etc/passwd是否被非法修改
#!/bin/bash
FILE_PATH=/etc/passwd
while true;do
    echo "The Time is `date +%F`"
    OLD=`md5sum $FILE_PATH|cut -d" " -f 1`
    sleep 5
    NEW=`md5sum $FILE_PATH|cut -d" " -f 1`
    if [[ $OLD != $NEW ]];then
        echo "The $FILE_PATH has been modified"
    fi
done
  • 每10s循環(huán)判斷用戶是否登錄系統(tǒng)
#!/bin/bash
USER=test
while true;do
    echo "The Time is `date +%F`"
    sleep 10
    NUM = `who|grep "$USER"|wc -l`
    if [[ $NUM -ge 1 ]];then
        echo "The $USER is login in system"
    fi
done

case選擇語句

  • case選擇語句主要用于對多個選擇條件進行匹配輸出,與if...elif語句結構類似,通常用于腳本傳遞輸出參數(shù),打印出輸出結果及內容,其語法格式以case...in開頭,esac結尾
#!/bin/bash
case $1 in
    Pattern1)
    語句1
    ;;
    Pattern2)
    語句2
    ;;
    Pattern3)
    語句3
    ;;
esac
  • 打印monitor及archive選擇菜單
#!/bin/bash
case $1 in
        monitor)
        monitor_log
        ;;
        archive)
        archiver_log
        ;;
        help)
        echo -e "\033[32mUsage:{$0 monitor |archive |help}\033[0m"
        ;;
        *)
        echo -e "\033[32mUsage:{$0 monitor |archive |help}\033[0m"
esac

select選擇語句

  • select選擇語句一般用于選擇,常用于選擇菜單的創(chuàng)建,可以配合PS3來打印菜單的輸出信息,其語法格式以select...in do開頭,done結尾
select i in (表達式);do
    語句
done
  • 打印操作系統(tǒng)選擇
#!/bin/bash
PS3="select system"
select i in Centos Ubuntu Windows;do
    echo "your select system: "$i
done
  • 打印LAMP選擇菜單
#!/bin/bash
PS3="select system"
select i in http MySQL PHP quit;do
case $i in
        http)
        echo Test Httpd
        ;;
        MySQL)
        echo Test MySQL
        ;;
        PHP)
        echo Test PHP
        ;;
        quit)
        echo The System exit
        exit
esac
done

shell編程函數(shù)

  • shell允許將一組命令集或者語句形成一個可用塊,這些塊稱為shell函數(shù),shell函數(shù)的好處在于只需定義一次,后期隨時使用,無須在shell腳本中添加重復的語句塊,其語法格式為以"function name(){"開頭,以"}"結尾
  • shell編程函數(shù)默認不能將參數(shù)傳入()內部,shell函數(shù)參數(shù)傳遞在調用函數(shù)名稱時傳遞,例如name argv1 argv2
function name(){
    command1
    command2
    ...
}
name argv1 argv2
  • 創(chuàng)建Apache軟件安裝函數(shù),給函數(shù)Apache_install傳遞參數(shù)1
#!/bin/bash
H_FILES=httpd-2.2.31.tar.bz2
HFILES_DIR=httpd-2.2.31
H_PREFIX=/usr/local/apache
H_URL=http://mirrors.cnnic.cn/apache/httpd/
function apache_install(){
if [[ $1 -eq 1 ]];then
    wget -c $H_URL/$H_FILES && tar -xf $H_FILES && cd $HFILES_DIR &&./configure --prefix=$H_PREFIX
    if [[ $? -eq0 ]];then
        make && make install
        echo -e "\n\033[32m---------------------------\033[0m"
        echo -e "\033[32mThe $HFILES_DIR Server Install Success!\033[0m"
    else
        echo -e "\033[32mThe $HFILES_DIR Make or Make install ERROR,Please Check..."
        exit 0
    fi
fi
}
apache_install 1

shell數(shù)組編程

  • 數(shù)組是相同數(shù)據(jù)類型的元素按一定順序排列的集合,把有限個類型相同的變量用一個名字命名,然后用編號區(qū)分它們變量的集合,這個名稱即為數(shù)組名,編號即為下標.Linux shell編程中常用一維數(shù)組
  • 數(shù)組的設計實際上是為了處理方便,把具有相同類型的若干變量按有序的形式組織起來的一種形式,以減少重復頻繁的單獨定義
  • 定義數(shù)組一般以小括號的方式來定義,數(shù)組的值可以隨機指定,以下為一維數(shù)組的定義、統(tǒng)計、引用和刪除
  1. 一維數(shù)組的定義及創(chuàng)建
CITY=(
    beijing
    tianjin
    shanghai
)
LAMP=(httpd php php-devel php-mysql mysql mysql-server)
  1. 數(shù)組下標一般從0開始,引用數(shù)組的方法為
    • echo ${CITY[0]}:引用第一個數(shù)組變量
    • echo ${CITY[1]}:引用第二個數(shù)組變量
    • echo ${CITY[@]}:顯示該數(shù)組所有參數(shù)
    • echo ${#CITY[@]}:顯示該數(shù)組參數(shù)個數(shù)
    • echo ${#CITY[0]}:顯示beijing字符長度
    • echo ${CITY[@]:0}:打印所有數(shù)組的值
    • echo ${CITY[@]:1}:打印從第二個值開始的所有值
    • echo ${CITY[@]:0:2}:打印第一個值與第二個值
    • echo ${CITY[@]:1:2}:打印第二個值與第三個值
  2. 數(shù)組替換操作
    • CITY=([0]=www1 [1]=www2 [2]=www3):數(shù)組賦值
    • echo ${CITY[@]/beijing/nanjing}:將數(shù)組值beijing替換為nanjing
    • NEWCITY=echo ${CITY[@]/beijing/nanjing}
  3. 數(shù)組刪除操作
    • unset array[0]:刪除數(shù)組第一個值
    • unset array[1]:刪除數(shù)組第二個值
    • unset array:刪除整個數(shù)組
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容