腳本
mysql
●BASH=GNU Bourne-Again Shell,BASH是GNU組織開發和推廣的一個項目。ios
Bash腳本相似批處理,簡單來說就是把許多的指令集合在一塊兒,並提供循環、條件、判斷等重要功能,語法簡單實用,用以編寫程序,大大簡化管理員的操做,並能夠完成圖形工具沒法實現的功能。web
[1.如何建立新shell腳本]sql
1.建立包含bash命令的文本文件(通常文件名後加.sh),文件第一行:shell
#!/bin/bash數據庫
2.使文件可執行(chmod +x scripts)vim
3.將文件放置在用戶的$PATH的目錄中bash
~/bin 用於用戶的私有程序ssh
/usr/local/bin 本地開發、系統上的其餘人使用的腳本ide
/usr/local/sbin 本地開發、由root使用的腳本
運行腳本:sh+文件名或者直接編寫文件所在絕對路徑
例如:
[root@web1 mnt]# vim 1.sh 編寫腳本(如下爲內容)
#!/bin/bash
echo hello world
[root@web1 mnt]# chmod +x 1.sh 給可執行權限
[root@web1 mnt]# /mnt/1.sh 運行腳本
hello world
[root@web1 mnt]# sh 1.sh 運行腳本
hello world
[root@web1 mnt]# vim 1.sh
#!/usr/bin/env/tcsh -x
cat /mnt/1.sh
[root@web1 mnt]# sh -x 1.sh (對於/usr/bin/env這種腳本,執行時用sh)
+ cat /mnt/1.sh
#!/usr/bin/env tcsh -x
cat /mnt/1.sh
[root@web1 mnt]# echo $2 (特殊字符如$ ! `` # *等須要在前加轉義字符\才能顯示)
[root@web1 mnt]# echo \$2
$2
[root@web1 mnt]# echo '\$2' (''強化顯示)
\$2
[root@web1 mnt]# echo "\$2" (""弱化顯示)
$2
[root@web1 mnt]# echo "''"
''
[root@web1 mnt]# echo '""'
""
[root@web1 mnt]# echo \'\'
''
[root@web1 mnt]# echo ****** ****** (顯示當前目錄的全部內容)
1.sh Kwestos.+157+49996.key Kwestos.+157+49996.private 1.sh Kwestos.+157+49996.key Kwestos.+157+49996.private
[root@web1 mnt]# echo "****** ******" (要想顯示**須要加"")
****** ******
[root@web1 mnt]# echo "****** `date` ******"
****** Tue Dec 13 08:39:41 EST 2016 ******
[root@web1 mnt]# echo '****** `date` ******'
****** `date` ******
[root@web1 mnt]# a=1 給a一個值
[root@web1 mnt]# echo $a 輸出a的值
1
[root@web1 mnt]# echo $ab
[root@web1 mnt]# echo ${a}b
1b
[root@web1 mnt]# a=`date`
[root@web1 mnt]# echo $a
Tue Dec 13 08:47:17 EST 2016
[命令替換]
[root@web1 mnt]# s=`date`
[root@web1 mnt]# echo $s
Wed Dec 14 08:18:20 EST 2016
[root@web1 mnt]# vim 4.sh
[root@web1 mnt]# echo $s
Wed Dec 14 08:18:20 EST 2016
[root@web1 mnt]# sh 4.sh
[root@web1 mnt]# s=1
[root@web1 mnt]# sh 4.sh
[root@web1 mnt]# export s=1
[root@web1 mnt]# sh 4.sh
1
[root@web1 mnt]# cd
[root@web1 ~]# chmod +x /mnt/4.sh 加執行權限
[root@web1 ~]# /mnt/4.sh
[root@web1 ~]# vim .bash_profile
PATH=$PATH:$HOME/bin
export PATH
s=1 添加設置s的值爲1
[root@web1 ~]# source .bash_profile 要執行腳本須執行此命令
[root@web1 ~]# /mnt/4.sh
1
[root@web1 ~]# su - student
Last login: Wed Dec 14 07:57:25 EST 2016 on pts/0
[student@web1 ~]$ /mnt/4.sh
[student@web1 ~]$ logout
[root@web1 ~]# vim /etc/profile 配置文件
[root@web1 ~]# /mnt/4.sh
1
[root@web1 ~]# source /etc/profile 刷新
[root@web1 ~]# /mnt/4.sh
10
[root@web1 ~]# logout
Connection to 172.25.254.149 closed.
[kiosk@foundation49 Desktop]$ ssh root@172.25.254.149
root@172.25.254.149's password:
Last login: Wed Dec 14 08:05:53 2016 from 172.25.254.49
[root@web1 ~]# /mnt/4.sh 從新登錄時腳本將變爲初次設置的值(vim .bash_profile中設置的值)
1
[root@web1 ~]# su - student
Last login: Wed Dec 14 08:22:10 EST 2016 on pts/0
[student@web1 ~]$ /mnt/4.sh 其餘用戶
10
[student@web1 ~]$
[root@web1 ~]# vim .bash_profile
export PATH
export s=1
export PATH=$PATH:/mnt
[root@web1 ~]# source .bash_profile
[root@web1 ~]# 4.sh
1
[root@web1 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/mnt
[shell計算命令]
++ 自增
-- 自減
- 減法 + 加法
** 冪運算 * 乘法
/ 除法 % 餘數
+= 加等 -= 減等
[root@web1 ~]# echo $[1+2]
3
[root@web1 ~]# echo $[2*2]
4
[root@web1 ~]# echo $[2**3]
8
[root@web1 ~]# echo $[2/3]
0
[root@web1 ~]# echo $[2%3]
2
[root@web1 ~]# echo `expr 1 + 2 ` 用expr表示數學運算
3
[root@web1 ~]# let a=1+2 用let指示數學運算
[root@web1 ~]# echo $a
3
[root@web1 ~]# ((a=3+4)) 用(())表示數學運算。bash內建功能,效率高
[root@web1 ~]# echo $a
7
[root@web1 ~]# a=2+3 此種寫法不是運算會按照字符輸出
[root@web1 ~]# echo $a
2+3
查看文件屬性:
test -{b|c|e|f|d|r|w|x|s|L} file/directory
[ -b /dev/sda ];echo $? 判斷文件是否爲一個block device
1
[ -c /dev/sda ];echo $? 判斷文件是否存在且是一個character device
0
[ -e /dev/sda ];echo $? 判斷文件是否存在,經常使用
0
[ -f /dev/sda ];echo $? 判斷文件是否存在且爲文件(file),經常使用
0
[ -d /dev/sda ];echo $? 判斷文件是否存在且爲目錄(directory),經常使用
1
[ -L /dev/sda ];echo $? 判斷文件是否存在且爲一個連接文件
1
test -{zn} string
test -z string 判斷字符串是否爲0?若string爲空字符串,則爲true
test -n string 判斷判斷字符串是否非爲0?若string爲空字符串,則爲false
[root@web1 ~]# for (( i=1;i<=10;i++ )) ; do echo $i; done
[root@web1 ~]# for (( i=1;i<10;i++ )) ; do ((j+=i)); echo $j; done
1
3
6
10
15
21
28
36
45
腳本經常使用語句(for;do;done語句,while;do;done語句等)
腳本---> 10秒倒計時腳本:
[root@web1 mnt]# vim time.sh
[root@web1 mnt]# sh time.sh 執行腳本
[root@web1 mnt]# cat time.sh
#!/bin/bash
for ((SEC=10;SEC>0;SEC--))
do
echo -ne "After ${SEC}s is end"
echo -ne "\r \r" 換行
sleep 1 停頓1秒
Done
腳本---> 一分十秒倒計時腳本;
[root@web1 mnt]# vim time.sh
[root@web1 mnt]# sh time.sh
After 0:56s is end^C
[root@web1 mnt]# cat time.sh
#!/bin/bash
MIN=1
for ((SEC=10;SEC>=0;SEC--))
do
echo -ne "After ${MIN}:${SEC}s is end"
sleep 1
echo -ne "\r \r"
while [ "$SEC" -le "0" -a "$MIN" -gt "0" ]
do
echo -ne "After ${MIN}:${SEC}s is end"
echo -ne "\r \r"
((MIN--))
SEC=60
done
Done
腳本---> 鏈接172.25.254.x 能ping通顯示is up,不能ping通顯示:
[root@web1 mnt]# vim ping.sh is down的腳本
[root@web1 mnt]# sh ping.sh
172.25.254.1 is up
172.25.254.2 is up
172.25.254.3 is up
172.25.254.4 is up
172.25.254.5 is up
172.25.254.6 is up
172.25.254.7 is up
172.25.254.8 is down
172.25.254.9 is up
172.25.254.10 is up
[root@web1 mnt]# cat ping.sh
#!/biin/bash
for NUM in {1..10}
do
ping -c1 -w1 172.25.254.$NUM &> /dev/null
while
[ "$?" -eq "0" ]
do
echo 172.25.254.$NUM is up
break
done
while
[ "$?" -ne "0" ]
do
echo 172.25.254.$NUM is down
done
done
也能夠是第二種:
[root@web1 mnt]# vim ping.sh
[root@web1 mnt]# cat ping.sh
#!/biin/bash
for NUM in {1..10}
do
ping -c1 -w1 172.25.254.$NUM &> /dev/null && echo 172.25.254.$NUM is up || echo 172.25.254.$NUM is down
done
[root@web1 mnt]# bash -x ping.sh 查看腳本信息
+ for NUM in '{1..10}'
+ ping -c1 -w1 172.25.254.1
+ echo 172.25.254.1 is up
172.25.254.1 is down
+ for NUM in '{1..10}'
+ ping -c1 -w1 172.25.254.2
+ echo 172.25.254.2 is up
172.25.254.2 is down
+ for NUM in '{1..10}'
+ ping -c1 -w1 172.25.254.3
+ echo 172.25.254.3 is up
172.25.254.3 is down
+ for NUM in '{1..10}'
+ ping -c1 -w1 172.25.254.4
+ echo 172.25.254.4 is up
172.25.254.4 is down
+ for NUM in '{1..10}'
+ ping -c1 -w1 172.25.254.5
+ echo 172.25.254.5 is up
172.25.254.5 is down
+ for NUM in '{1..10}'
+ ping -c1 -w1 172.25.254.6
+ echo 172.25.254.6 is up
172.25.254.6 is down
+ for NUM in '{1..10}'
+ ping -c1 -w1 172.25.254.7
+ echo 172.25.254.7 is up
172.25.254.7 is down
+ for NUM in '{1..10}'
+ ping -c1 -w1 172.25.254.8
+ echo 172.25.254.8 is down
172.25.254.8 is down
+ for NUM in '{1..10}'
+ ping -c1 -w1 172.25.254.9
+ echo 172.25.254.9 is up
172.25.254.9 is down
+ for NUM in '{1..10}'
+ ping -c1 -w1 172.25.254.10
+ echo 172.25.254.10 is up
172.25.254.10 is down
腳本---> 數據庫備份:
vim MsqDump.sh
#!/bin/bash
for x in $(mysql -uroot -predhat -e "show databases;" -NE | grep -E "^\*|schema$"-v)
do
mysqldump -uroot -predhat $x >/mnt/$x.dump
done
[]數字運算比較符 -z 爲空 -n 不爲空
-eq 等於 -lt小於 -le小於等於 -gt 大於 -ge大於等於
文件狀態運算符:
-d 設備 -c字符 -e是否可執行 -L軟連接 -d目錄 -f普通文件
1.Vim time.sh
#!/bin/bash
HOUR=1
MIN=1
for ((SEC=10;SEC>=0;SEC--))
do
echo -ne "After ${MIN}:${SEC}s is end"
sleep 1
echo -ne "\r \r"
while [ "$SEC" -le "0" -a "$MIN" -gt "0" -a "$HOUR" -ge "0" ]
while [ "$SEC" -le "0" -a "$MIN" -gt "0" -a "$HOUR" -ge "0" ]
do
echo -ne "After ${MIN}:${SEC}s is end"
echo -ne "\r \r"
(($HOUR--))
MIN=60
done
((MIN--))
SEC=60
done
Done
2.vim connection.sh
#!/bin/bash
for NUM in {1..30}
do
ping -c1 -w1 172.25.254.$NUM &> /dev/null && (
/mnt/ping.exp 172.25.254.$NUM redhat echo '#!/bin/bash' > userfile ec ho CKUSER='gentent passwd westos$NUM' >>userfile echo '[ -z "$CKUSER"]&&(user add westos$NUM ' >> userfile echo 'echo 172.25.254.$NUM | passwd --stdin weto s$NUM) || echo "westos$NUM exist!"'
) || echo 172.25.254.$NUM is connected faild
done
3.vim check.exp#!/usr/bin/expectset timeout 3set Ip [lindex $argv 0]set Pass [lindex $argv 1]set comn [lindex $argv 2]spawn ssh root@$ip $comnexpect { "yes/no" {send"yes/r";exp_continue} "password:" {send "$Pass\r"} }expect eof