1. 程式人生 > >shell腳本學習

shell腳本學習

pda don 分隔符 等於 判斷 是否 ++ 時間服務 user

正則表達式
^開始標記

$結束標記
[a-z]
[A-Z]
[0-9]
. 單個任意字符
* 前面字符重復的次數>=0
+ 前面字符重復的次數>=1
? 前面字符重復的次數0 or 1
{n,m} 前面字符重復的次數n到m次

[A-Z][0-9][0-9] B12 B1A

# grep ‘^r.*n$‘ /etc/passwd

sed ‘匹配條件/執行的動作‘ /etc/passwd
或者
cat /etc/passwd | sed ‘匹配條件/執行的動作‘

替換 sed ‘s/old/new/g‘

ifconfig | grep ‘inet addr:‘
|grep -v ‘127.0.0.1‘| sed ‘s/inet addr://g‘ | sed ‘s/Bcast.*//g‘

awk
# awk -F: ‘{print $1}‘ /etc/passwd 取第一列,以冒號為分隔符

---------------------------------------------------------------------------------------
環境變量 系統 -- 多個用戶set命令查看環境變量
--用戶環境變量(/root/.bash_profile)
--系統環境變量(/etc/profile)

位置變量
--通常和腳本聯合使用
--$0 腳本名稱
--$1、$2、$3、$4…$9 位置參數

預定義變量
--$? 表示程序退出的代表(一般0代表執行成功,非0表示執行失敗)
echo $?
--$# 代表當前shell的參數個數
--$*(一個整串) [email protected] (每個參數算一個字符串)代表所有參數
--$$ 當前進程的PID

自定義變量
--語法格式為:name=[value]
--註意:
變量等號兩邊不能有空格
變量對大小寫敏感
--定義好後使用($變量名)來調用變量的值


算數運算
-- + - * / %
--$((expression))
--$[expression]
--expr expression
a=2(重復賦值會進行覆蓋)
b=3
# echo $(($a+$b))或$(a+b)
# echo $[$a+$b]
# expr 5 + 2 註意有空格
# expr $a + $b


內置測試判斷 成功/成立 -- 失敗/不成立
--test 測試表達式
--[ 測試表達式 ] 最常見的
--註意: 測試表達式與中括號之間一定要有空格

數值比較
-eq 等於則為真
-ne 不等於則為真
-gt 大於則為真
-ge 大於等於則為真
-lt 小於則為真
-le 小於等於則為真


舉例1:
[[email protected] ~]# echo $a $b
2 3
[[email protected] ~]# test $a -lt $b
[[email protected] ~]# echo $?
0成功
[[email protected] ~]# test $a -gt $b
[[email protected] ~]# echo $?
1失敗

舉例2:
[[email protected] ~]# echo $a $b
2 3
[[email protected] ~]# [ $a -lt $b ]
[[email protected] ~]# echo $?
0
[[email protected] ~]# [ $a -gt $b ]
[[email protected] ~]# echo $?
1


&& 邏輯與
-- cmd1 && cmd2 cmd1成功了才會執行cmd2
|| 邏輯或
-- cmd1 || cmd2 cmd1失敗了才會執行cmd2
; 無邏輯關系
-- cmd1 ; cmd2 cmd1執行完後,執行cmd2

字串測試(字符串要用雙引號引起來)
= 等於則為真
!= 不相等則為真
-z 字串 字串長度0則為真
-n 字串 字串長度不0則為真

文件測試
-e 文件名 如果文件存在則為真
-d 文件名 判斷是否為目錄
-f 文件名 如果文件存在且為普通文件則為真
-r 文件名 如果文件存在且可讀則為真
-w 文件名 如果文件存在且可寫則為真
-x 文件名 如果文件存在且可執行則為真
-s 文件名 如果文件存在且至少有一個字符則為真
Linux還提供了非(!)、或(-o)、與(-a)三個邏輯操作符,
用於將測試條件連接起來,其優先順序為:!最高,-a次之,-o最低

date (man +命令,查看幫助)
# date ‘+%Y%m%d%H%M‘
# date -d ‘7 day ago‘ ‘+%Y%m%d%H%M‘
# date -s "2016-04-09 15:30:13" 修改系統時間(臨時)

取字符串 ${變量名:offset:length}
[[email protected] ~]# a="201604091527"
[[email protected] ~]# echo $a
201604091527
[[email protected] ~]# echo ${a:2:3} 跳過兩個取3個
160

取字符串 echo ${變量名%.*}
[[email protected] ~]# a="123.log"

[[email protected] ~]# echo ${a%.*}
123

find 查找文件
-type -name
-size(文件的大小) -mtime(文件的修改時間)
腳本案例:

#!/bin/bash
# #號表示註釋
# shell腳本從上往下依次執行
date
grep ‘root‘ /etc/passwd

執行腳本:
# chmod +x 1.sh
# /tmp/1.sh

. /tmp/1.sh 執行文件/tmp/1.sh


控制語句
#!/bin/bash
for i in {1..50}
do
mkdir /usr/local/src/dir$i
done

#!/bin/bash
for i in `seq 50` #反引號代表命令預先執行
do
mkdir /usr/local/src/dir$i
done

#!/bin/bash
for((i=1;i<=10;i++));do
SUM=$((SUM+i))
done
echo $SUM

#!/bin/bash
i=1
while [ $i -le 10 ]
do
SUM=$((SUM+i))
i=$[i+1]
done
echo $SUM

#!/bin/bash
while read -r line
do
echo $line:HELLO
done < /etc/passwd

username:hello
root: hello
adm: hello

#!/bin/bash
while read -r line
do
echo `echo $line | awk -F: ‘{print $1}‘`:HELLO
done < /etc/passwd

#!/bin/bash
if [ -d /tmp/123 ];then
ls /tmp/123
else
mkdir /tmp/123
fi



top free


#!/bin/bash
case $1 in
top)
top
;;
free)
free
;;
df)
df
;;
*)
echo "usage:$0{top|free|df}"
esac

if for while case --控制語句

shell函數: 多次重復調用的一些命令通常可以放函數裏面
#!/bin/bash
sum(){
echo $(($1+$2))
}
sum 5 6

計劃任務

用法:at [時間] 指定時間執行特定命令

舉例:
at 4:17 #指定在當天淩晨4點17分執行計劃任務
at> cp /etc/passwd /tmp #計劃任務內容
at> <EOT> #輸入完成後,按ctrl+d結束 周期性的計劃任務 crontab

1) service crond status
chkconfig --list | grep crond
crontab -e
0 2 * * 3 cp /etc/passwd /tmp每周三2點備份
5 1 10,25 * * rm -rf /tmp/* 每個月10號和25號淩晨1點5分清空
*/10 * * * * ntpdate 時間服務器IP 每10分鐘執行時間同步
0 1-6 * * * 每天淩晨1點到6點執行

技術分享

2)重啟crond服務 service crond restart

tail -f動態查看

crontab [-u 用戶] [-l|-r|-e]

-l:列出執行任務

-u:指定某個用戶,不加-u選項則為當前用戶

-e:制定計劃任務

shell腳本學習