第1章 shell編程基礎
1.1 書寫腳本
/server/scripts
#!/bin/bash
get ip address
ip=`hostname -I|awk '{print $1}'`
mkdir && backup
mkdir -p /backup/$ip
tar zcf /backup/$ip/etc-`date +%F`.tar.gz /etc/
1.2 變量
1.2.1 什麼是變量?
x + y = 10 x=20 y=? 未知數(變量)
1.2.2 變量命名規則:
不能以數字開頭
1.2.3 賦值(把數據存放在變量中)
[root@oldboyedu50-lnb /server/scripts]# ip=10.0.0.200
[root@oldboyedu50-lnb /server/scripts]# echo $ip
10.0.0.200
1.3 變量分類:
1.3.1 普通變量(局部變量)
1.3.2 環境變量(全局變量)
1.大寫
2.系統定義的
3.在大部分地方可以使用
PATH PS1 LANG
實例1-1 env結果的第1列
awk
env |awk -F= '{print $1}'
sed
env |sed 's#=.*##g'
grep
env|egrep '^[A-Z0-9_]+' -o
env|egrep '^[^=]+'
1.4 全局變量與局部變量區別
[root@oldboyedu50-lnb /server/scripts]# unset OLDBOY
[root@oldboyedu50-lnb /server/scripts]# env |grep OLDBOY
[root@oldboyedu50-lnb /server/scripts]# OLDBOY=10
[root@oldboyedu50-lnb /server/scripts]# echo $OLDBOY
10
[root@oldboyedu50-lnb /server/scripts]# cat show.sh
echo $OLDBOY
[root@oldboyedu50-lnb /server/scripts]# sh show.sh
[root@oldboyedu50-lnb /server/scripts]# source show.sh
10
[root@oldboyedu50-lnb /server/scripts]# . show.sh
10
1.5 特殊變量:(重點)
[root@oldboyedu50-lnb /server/scripts]# week=6
[root@oldboyedu50-lnb /server/scripts]# echo $week
6
[root@oldboyedu50-lnb /server/scripts]# echo $weekday
6day
實例1-2 書寫一個計算器 加減乘除
變量中 把兩個數字放在變量中
[root@oldboyedu50-lnb /server/scripts]# n1=10
[root@oldboyedu50-lnb /server/scripts]# n2=20
[root@oldboyedu50-lnb /server/scripts]# awk 'BEGIN{print n1/n2}'
awk: fatal: division by zero attempted
命令行中的變量 放在awk中使用
[root@oldboyedu50-lnb /server/scripts]# awk 'BEGIN{print n1,n2}'
[root@oldboyedu50-lnb /server/scripts]# awk -vnum1=10 'BEGIN{print num1 }'
10
[root@oldboyedu50-lnb /server/scripts]# awk -vnum1=10 -vnum2=20 'BEGIN{print num1/num2 }'
0.5
實例1-3 書寫腳本計算10與20的加減乘除
cal.sh
#!/bin/bash
n1=10
n2=30
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1-num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2 }'
1.5.2 vim批量操作
1.進入批量編輯模式(可視塊)
2.選擇 批量增加的範圍
3.按 shift + i 進行修改
4.按esc 退出等等
1.6 特殊符號:
$1 $2 $數字 awk:第1列 第2列 第3列
shell腳本:第1個參數
$0 awk:整行
shell腳本:文件名
$# 判斷腳本的參數個數
$? 上一個命令的執行結果(返回值)
0 執行正確
非0 執行失敗
[root@oldboyedu50-lnb /server/scripts]# cat cal.sh
#!/bin/bash
n1=$1
n2=$2
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1-num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2 }'
[root@oldboyedu50-lnb /server/scripts]# sh cal.sh 10 20
30
-10
200
0.5
實例1-4 cal-read.sh 通過read命令實現 n1 n2賦值
#!/bin/bash
read -p "input num1,num2:" n1 n2
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1-num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2 }'
1.7 判斷 if
1.7.1 如果/oldboy 目錄存在 顯示 /oldboy dir exist
# ls /oldboy/ && echo dir exist
1.7.2 如果/oldboy 不存在 則創建這個目錄
[root@oldboyedu50-lnb /oldboy]# cd /oldboya/ || mkdir -p /oldboya
-bash: cd: /oldboya/: No such file or directory
[root@oldboyedu50-lnb /oldboy]# ll -d /oldboya/
drwxr-xr-x 2 root root 4096 Aug 17 12:16 /oldboya/
實例1-5 判斷文件目錄是否存在
[root@oldboyedu50-lnb /oldboy]# [ -d /oldboy ] && echo dir exist
dir exist
[root@oldboyedu50-lnb /oldboy]# [ -d /oldboy ] || mkdir -p /oldboy
條件表達式:
-eq equal ==
-ne not equal !=
-gt great than >
-ge great equal >=
-lt less than <
-le less equal <=
1.7.3 命令是否執行正確
[root@oldboyedu50-lnb /oldboy]# [ 10 -eq 10 ]
[root@oldboyedu50-lnb /oldboy]# echo $?
0
[root@oldboyedu50-lnb /oldboy]# [ 10 -gt 10 ]
[root@oldboyedu50-lnb /oldboy]# echo $?
1
[root@oldboyedu50-lnb /oldboy]# [ 10 -ge 10 ]
[root@oldboyedu50-lnb /oldboy]# echo $?
0
[root@oldboyedu50-lnb /oldboy]# [ -d /oldboy ]
[root@oldboyedu50-lnb /oldboy]# echo $?
0
[root@oldboyedu50-lnb /oldboy]# [ -d /oldboyaaa ]
[root@oldboyedu50-lnb /oldboy]# echo $?
1
實例1-6 判斷腳本的參數個數,如果不是2則提示請輸入兩個數字
[root@oldboyedu50-lnb /server/scripts]# cat pan.sh
#!/bin/bash
if [ $# -ne 2 ];then
echo "輸入兩個數字"
fi
實例1-7 給計算器(參數傳遞)增加一個條件,判斷腳本的參數個數,如果不是2則,提示請輸入兩個數字
[root@oldboyedu50-lnb /server/scripts]# cat cal.sh
#!/bin/bash
n1=$1
n2=$2
if [ $# -ne 2 ];then
echo "USAGE: $0 num1 num2"
exit
fi
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1-num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2 }'
[root@oldboyedu50-lnb /server/scripts]# sh cal.sh
USAGE: cal.sh num1 num2
[root@oldboyedu50-lnb /server/scripts]# sh cal.sh 120 20
140
100
2400
6
實例1-8 comp.sh輸入兩個數字:
1.如果n1大於n2
n1 > n2
2.如果n1不大於n2
n1 <= n2
[root@oldboyedu50-lnb /server/scripts]# cat comp.sh
#!/bin/bash
n1=$1
n2=$2
if [ $n1 -gt $n2 ];then
echo "$n1 > $n2"
else
echo "$n1 <= $n2"
fi
[root@oldboyedu50-lnb /server/scripts]# sh comp.sh 10 20
10 <= 20
[root@oldboyedu50-lnb /server/scripts]# sh comp.sh 10 10
10 <= 10
[root@oldboyedu50-lnb /server/scripts]# sh comp.sh 100 10
100 > 10