- 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)境變量、用戶變量
- 系統(tǒng)變量
- $0:當前腳本名稱
- $n:當前腳本的第n個參數(shù)
- $*:當前腳本的所有參數(shù)(不包括程序本身)
- $#:當前腳本的參數(shù)個數(shù)(不包括程序本身)
- $?:命令或程序執(zhí)行完后的狀態(tài),返回0表示執(zhí)行成功
- $$:程序本身的PID號
- 環(huán)境變量
- PATH:命令所示路徑,以冒號為分割
- HOME:打印用戶家目錄
- SHELL:顯示當前shell類型
- USER:打印當前用戶名
- ID:打印當前用戶ID信息
- PWD:顯示當前所在路徑
- TERM:打印當前終端類型
- HOSTNAME:顯示當前主機名
- 用戶變量
- A=apple
- 系統(tǒng)變量
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)計、引用和刪除
- 一維數(shù)組的定義及創(chuàng)建
CITY=(
beijing
tianjin
shanghai
)
LAMP=(httpd php php-devel php-mysql mysql mysql-server)
- 數(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}:打印第二個值與第三個值
- 數(shù)組替換操作
- CITY=([0]=www1 [1]=www2 [2]=www3):數(shù)組賦值
- echo ${CITY[@]/beijing/nanjing}:將數(shù)組值beijing替換為nanjing
- NEWCITY=
echo ${CITY[@]/beijing/nanjing}
- 數(shù)組刪除操作
- unset array[0]:刪除數(shù)組第一個值
- unset array[1]:刪除數(shù)組第二個值
- unset array:刪除整個數(shù)組