1. 程式人生 > >Linux學習之二十一-shell編程基礎

Linux學習之二十一-shell編程基礎

用法 htm 如果 重定向 -a 創建 過去 .html 編寫代碼

Shell編程基礎

Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設計語言。Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。Shell 腳本(shell script),是一種為 shell 編寫的腳本程序

Shell 編程跟 java、php 編程一樣,只要有一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就可以了

  1. Linux中的shell種類(shell解釋器的種類)

[root@localhost ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

  1. 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、直接使用腳本的絕對路徑即可

  1. 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"

  1. 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

  1. 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

  1. 00 * * * /bin/bash /service/scripts/backup.sh &>/dev/null

關於shell腳本的更多知識點,可以參考

http://www.runoob.com/linux/linux-shell.html

博主原創文章,轉載請務必註明出處

Linux學習之二十一-shell編程基礎