Linux學習之二十一-shell編程基礎
Shell編程基礎
Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設計語言。Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。Shell 腳本(shell script),是一種為 shell 編寫的腳本程序
Shell 編程跟 java、php 編程一樣,只要有一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就可以了
- Linux中的shell種類(shell解釋器的種類)
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
- shell腳本基本規則及執行
在shell腳本文件中,第一行要指明使用哪種shell解釋器
#!/bin/bash #指定shell解釋器為bash
從第二行開始的內容就是若幹命令
例:簡單的shell腳本
#!/bin/bash
pwd
mkdir -p test{1..10}
touch test{1..10}/oldboy{1..10}
ifconfig eth0|awk -F "[: ]+" ‘NR==2{print $4}‘>>ip.txt
echo "hello world!"
parted /dev/sda p
shell腳本的執行方式
方法1、bash + 腳本名稱
方法2、sh + 腳本名稱
可以使用參數sh -x 進入到debug調試模式,查看執行過程
方法3、./ + 腳本名稱
方法4、直接使用腳本的絕對路徑即可
- shell腳本引用變量
3.1 如果shell腳本全部是命令,靈活性會比較差,可以通過引用變量來實現,變量可以直接賦值也可以通過執行命令來賦值
變量的命名規則:
不能和系統已有的命令名字相同(多用大寫字母),不能以數字開頭
只能以下劃線,字母開頭,變量中間允許有數字
不能和系統當前已有的環境變量相同
3.2 執行命令env查看當前的環境變量
只查看系統所有環境變量名稱env|awk -F "=" ‘{print $1}‘
調用環境變量echo %變量名%
3.3 特殊環境變量$PS1可以自定義終端命令提示符
echo $PS1
PS1=‘[\u@\h \W]\$‘
PS1=‘[\[\e[31;1m\]\t\[\e[0m\] \u@\h \W]#‘
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
[root@localhost ~]# PS1=‘[\[\e[31;1m\]\t\[\e[0m\] \u@\h \W]#‘
[20:56:21 root@localhost ~]#
3.4 引用變量實例
#!/bin/bash
name=`hostname`
echo "你當前的主機名是 $name"
ip=`ifconfig eth0|awk -F "[: ]+" ‘NR==2{print $4}‘
echo "你當前的ip地址為$ip"
ks_line=`cat /root/anaconda-ks.cfg|wc -l`
echo "ks文件檢測 共$ks_line行"
rpm_count=`rpm -qa|wc -l`
echo "rpm包檢測 共$rpm_count個"
ip_r=`route -n|awk ‘$1=="0.0.0.0" && $2=="10.0.0.254"‘|wc -l`
echo "網關檢測 合格值為$ip_r"
log_file=`wc -l /tmp/install.log|wc -l`
echo "install日誌檢測 合格值為$log_file"
se_status=`sestatus|awk ‘{print $NF}‘` #sestatus查看selinux狀態
echo "selinux狀態檢查 狀態為$se_status"
ssh_config=`cat /etc/ssh/sshd_config|wc -l`
echo "ssh 優化檢測 合格值為$ssh_config"
- shell腳本中的for循環
例1:若需要批量創建10個用戶,並生成隨機密碼並進行修改,且重定向到文件中顯示用戶名和密碼
#!/bin/bash
for i in `seq -f stu%g 1 5`
do
useradd $i;PASS=`date +%N|md5sum|cut -c 1-8`;echo $i:$PASS >> passwd.txt;echo $PASS|passwd --stdin $i
done
例2:利用for循環,來優化開機啟動項
#!/bin/bash
for i in `chkconfig|grep ‘^[a-Z]‘|awk ‘{print $1}‘|sed ‘$d‘`; #先關閉所有開機啟動項
do
echo $i
chkconfig $i off
done
for j in network crond sysstat rsyslog sshd; #再開啟需要的啟動項
do
chkconfig $j on
done
例3:利用for循環,將txt結尾的文件修改為TXT
#!/bin/bash
for i in `ls *.txt`
do
old_name=`echo $i|awk -F "." ‘{print $1}‘`
mv $i ${old_name}.TXT
done
例4:嵌套for循環
批量創建10個以oldboy開頭的目錄,並在目錄中創建10個大於300k的文件要求使用dd命令來創建文件
#!/bin/bash
mkdir oldboy{1..10}
for n in oldboy{1..10}
do
for m in test{1..10}
do
dd if=/dev/zero of=${n}/$m bs=101k count=3
done
done
5、shell腳本中的if判斷語句
有關判斷的參數
gt 大於
eq 等於
lt 小於
ge 大於等於
le 小於等於
-o 邏輯或
-z 判斷輸入的是否為空
-n 判斷輸入的是否不為空
例1:猜數字遊戲
#!/bin/bash
num1=`echo $RANDOM*35/32767+1|bc`
read -p "請輸入一個數字:" num2
echo $num1
if [ $num1 -gt $num2 ];then
echo "你猜的小了"
elif [ $num1 -eq $num2 ];then
echo "恭喜你,猜對了!"
else
echo "你猜的大了"
fi
例2:利用固定用法read -p ‘*** ‘ str來讀取shell執行後用戶輸入的內容,判斷是否為空
#!/bin/bash
read -p ‘請輸入一個字符串:‘ str
echo $str
if [ -z $str ];then
echo "你輸入的內容不能為空!"
fi
- shell腳本生產案例
定時打包備份,保留最近一周的備份文件,過去的文件保留周六的
mkdir -p /service/scripts
cd /service/scripts/
註意:此處要求備份七天以外每周六的內容,可以選擇在周六剛剛過渡到周天的日期即周天淩晨,這樣周六的內容備份才較為完整,備份內容為周六的,那麽壓縮包的名稱需要用date命令的-d yesterday參數
#!/bin/bash
####beifen
W=`date +%w`
if [ $W -eq 0 ];then
tar zcvf /backup/6_etc_`date -d yesterday +%F`.tar.gz /etc
else
tar zcvf /backup/etc_`date -d yesterday +%F`.tar.gz /etc
fi
####qingli
find /backup -type f -name "*.tar.gz" -mtime +7|grep -v ‘6_etc_‘|xargs rm –rf
編寫腳本進行測試,修改當前時間並備份,最後同步時間
#!/bin/bash
for n in `seq -w 24`
do
date -s "201804$n";/bin/bash /service/scripts/backup.sh
done
ntpdate ntp1.aliyun.com
再把腳本寫到定時任務中
#on time backup
- 00 * * * /bin/bash /service/scripts/backup.sh &>/dev/null
關於shell腳本的更多知識點,可以參考
http://www.runoob.com/linux/linux-shell.html
博主原創文章,轉載請務必註明出處
Linux學習之二十一-shell編程基礎