BASH = GNU Bourne-Again Shell,BASH 是 GNU 組織開發和推廣的一個項目。
Bash腳本類似批處理,簡單來講就是把許多的指令集合在一起,並提供循環、條件、判斷等重要功能,語法簡單實用,用以編寫程序,大大簡化管理員的操作,並可以完成圖形工具所無法實現的功能。
bash是一個解釋器,解釋給內核,運行效率低。
2.創建新shell腳本:
1)創建包含bash命令的文本文件。文件的第一行應爲:
#!/bin/bash ##解釋器,將腳本里的內容解釋給內核,不可隨意更改
chmod +x scripts ##添加可執行權限
3)將文件放置在用戶的$PATH的目錄中
~/bin – 用於用戶的私有程序
/usr/local/bin – 本地開發、系統上的其他人使用的腳本
/usr/local/sbin - 本地開發、由root使用的腳本
直接運行腳本和使用source命令運行腳本是不同的!
腳本調試模式:
#!/bin/bash -x
#sh -x scripts
3.引用和轉義
引用和轉義在shell解析字符串時用於去除字符串中特殊字符或保留詞語的特殊含義。這會導致按字
面處理字符串,而不是展開變量或將其部分內容視作具有特殊含義。
引用有三種類型:
弱引用:
將字符串放置在雙引號中,保留字符串中所有字符的文字值,$、`、\和!字符除外。換言之,變量
擴展和命令擴展在雙引號內仍起作用。
強引用:
將字符串放置在單引號中,保留字符串中所有字符的文字值,同時禁用所有擴展:
轉義:
非引用的\是轉義字符。它保留了下一個字符的文字值。(例如,\$PATH是確切的字符串$PATH,而
不是PATH變量的內容。)
4.Shell變量
shell變量用於爲稍後在腳本中使用的名稱指定值,並且僅限於shell命令行或從中聲明變量的腳本。
若要定義或指定值:
FRUIT=apple
若要參考或使用變量:
$FRUIT
${FRUIT}
5.命令替換
命令替換在子shell中執行指定命令並用命令輸出替換腳本中的命令替換。語法:
$(shell command)
6.算術運算符
算術運算符指的是可以在程序中實現加、減、乘、除等數學運算的運算符。
operator meaning
<VARIABLE>++ 增量後
<VARIABLE>-- 減量後
- 減法
+ 加法
** 冪運算
* 乘法
/ 除法
% 餘數
+= 加等
-= 減等
Shell計算命令:
用$[]表示數學運算。
echo $[1+2]
expr 1 + 2
let a=1+2;echo $a
for ((i=1;i<10;i++));do echo $i;done
7.Bash位置參數
有兩種簡單的方法可以將用戶輸入讀入bash中的變量。
第一個方法是使用read提示用戶輸入(使用-p選項)並將其直接存儲到一個或多個變量:
交互式輸入
# read -p 'Enter your first and last name: ' FIRST LAST
指定的位置參數總數:$#
位置參數自身:$0、$1、$2、$3....
所有位置參數: $@、$*
#!/bin/bash
echo \$1 is $1
echo \$2 is $2
echo \$3 is $3
echo \$* is $*
echo \$@ is $@
echo \$# is $#
8.退出狀態
Linux命令完成時,將返回退出狀態。成功完成程序時,將返回0的推出狀態。這被bash當作邏輯True值。非零退出狀態通常表示發生了錯誤,並且被bash當作邏輯False值。例如:grep的退出狀態的含義:
0 – 在指定的文件中找到了模式
1 – 在指定的文件中未找到模式
>1 – 一些其他錯誤(無法打開文件、錯誤的搜索表達式等)
推出狀態的值被存儲在"?"中,可以使用以下命令查看:
# echo $?
######腳本######
1.檢測1~10主機是否開機,開機則顯示172.25.254.X is up,關機則顯示172.25.254.X is down
A && B || C ##A爲真則執行B,爲假則執行C
#!/bin/bash
for MUN in {1..10}
do
ping -c1 -w1 172.25.254.$MUN &> /dev/null && echo 172.25.254.$MUN is up || echo 172.25.254.$MUN is down
done
#!/bin/bash
for NAME in `cat $1`
do
useradd $NAME
done
3.備份/etc/目錄下以.conf結尾的所有文件,並且備份後的文件名爲etcconfig-時間戳
#!/bin/bash
BACKDIR=etcconfig-`date +%Y-%m-%d-%S`
mkdir -p /mnt/$BACKDIR
cp /etc/*.conf /mnt/$BACKDIR
4.五秒倒計時
-n 不換行 -e 執行 \r 刷新#!/bin/bash
for ((SEC=5;SEC>0;SEC--))
do
echo -n After ${SEC}s is end
echo -ne "\r \r"
sleep 1
done
5.1分10秒倒計時
-ge 大於等於 -gt 大於 -lt 小於 -a 並且#!/bin/bash
MIN=1
for ((SEC=10;SEC>=0;SEC--))
do
while [ "$SEC" -eq "0" -a "$MIN" -eq "0" ]
do
echo "TIME is END"
exit 0
done
while [ "$SEC" -eq "0" -a "$MIN" -gt "0" ]
do
echo -n "After ${MIN}m${SEC}s is end"
sleep 1
echo -ne "\r \r"
((MIN--))
SEC=59
done
echo -n "After ${MIN}m${SEC}s is end"
echo -ne "\r \r"
sleep 1
done
6.備份數據庫
#!/bin/bashmkdir -p /mnt/DB_BACK/
for DB in `mysql -uroot -e "show databases;" -E -N | grep -E '\*|schema$' -v`
do
DBNAME=$DB-`date +%Y-%m-%d-%S`
echo "Backing up $DB"
mysqldump $DB > /mnt/DB_BACK/$DBNAME
done
for DBNAME in `ls /mnt/DB_BACK/*`
do
SIZE=`stat --print "%s\n" $DBNAME`
echo $DBNAME\'s size is $SIZE byte
done
7.輸入網段查看ip
#!/bin/bash
read -p "please give me a interface:" ip_show
echo `ifconfig ${ip_show} | grep inet | grep inet6 -v | awk -F ' ' '{print $2}'`
8.檢測ip
#!/bin/bashwhile [ "$#" -eq "0" ]
do
echo "please give me a ip address!"
exit 1
done
ping -c1 -w1 $1 >/dev/null && echo "$1 is up" || echo "$1 is down"
9.檢測文件
#!/bin/bashls $1 &> /dev/null
[ "$?" -eq "0" ] && echo $1 is exist || echo $1 is not exist