第1章 shell中的特殊變量
1.1 $#
$# 表示參數的個數
1.1.1 【示例】腳本內容
[root@znix ~]# cat /server/scripts/show2.sh
#!/bin/bash
echo $1 $2 $#
if [ $? == 0 ];then
echo "OK"
fi
實例1-1 執行的不同結果
[root@znix ~]# sh /server/scripts/show2.sh 1 2 3 4 6
1 2 5
[root@znix ~]# sh /server/scripts/show2.sh aa bb
aa bb 2
[root@znix ~]# sh /server/scripts/show2.sh aa bb cc
aa bb 3
1.2 $?
$?表示:上一個命令執行后的狀態
狀態為0 表示執行正確
狀態非0 表示執行錯誤
1.2.1 【示例】$?的使用
[root@znix ~]# aaa
-bash: aaa: command not found
[root@znix ~]# echo $?
127
[root@znix ~]# sed
Usage: sed [OPTION]...
[root@znix ~]# echo $?
4
[root@znix ~]# sh /server/scripts/show2.sh aa bb
aa bb 2
[root@znix ~]# echo $?
0
1.3 【了解】編譯安裝的過程
切菜備菜 ./configure
炒菜 make
上菜 make install
1.4 如何向變量中存放內容---【read命令】
1.4.1 read命令使用
[root@znix ~]# read a
慘綠少年
[root@znix ~]# echo $a
慘綠少年
1.4.2 讓執行命令后出現提示信息
-p 為顯示提示信息。p作為輸出,一定要寫在其他參數的最后面。
[root@znix ~]# read -p "請輸入:" a
請輸入:呵呵
[root@znix ~]# echo $a
呵呵
1.4.3 設置等待(超時)的時間
-t5 等待5秒
[root@znix ~]# read -t5 -p "請輸入密碼:" a
請輸入密碼:
[root@znix ~]#
[root@znix ~]# read -t5 -p "請輸入密碼:" a
請輸入密碼:123
1.4.4 不顯示輸入的內容
-s 輸入的時候不顯示輸入內容。
[root@znix ~]# read -s -t50 -p "請輸入密碼:" a
請輸入密碼:
[root@znix ~]# echo $a
admin
1.5 將read命令運用到腳本上
1.5.1 修改計算器腳本的內容,讓他能夠更智能。
[root@znix ~]# vim /server/scripts/cal.sh
#!/bin/bash
read -p "input 1st num:" a
read -p "input 2st num:" b
1.5.2 測試腳本
[root@znix ~]# sh /server/scripts/cal.sh
input 1st num:1
input 2st num:2
0.5
3
-1
2
1.5.3 簡化命令
1.5.3.1 read 可以同時讀入多個字符。
[root@znix ~]# read -p "輸入第一個 第二關數字:" a b
輸入第一個 第二關數字:123 456
[root@znix ~]# echo $a $b
123 456
1.5.3.2 修改腳本的內容。
使用一條read命令,讀取兩個參數。
[root@znix ~]# vim /server/scripts/cal.sh
#!/bin/bash
read -p "input 1st&2st num:" a b
awk -vnum1=$a -vnum2=$b 'BEGIN{print num1/num2}'
awk -vnum1=$a -vnum2=$b 'BEGIN{print num1+num2}'
awk -vnum1=$a -vnum2=$b 'BEGIN{print num1-num2}'
awk -vnum1=$a -vnum2=$b 'BEGIN{print num1*num2}'
"/server/scripts/cal.sh" 15L, 355C written
1.5.3.3 測試腳本。
⚠注意 : 同時傳入兩個參數的時候,參數之間要使用空格分割.
[root@znix ~]# sh /server/scripts/cal.sh
input 1st&2st num:1 2
0.5
3
-1
2
第2章 判斷一個 文件/目錄 是否存在
2.1 幾種思路:
cat + $?'
ls + $?
test命令
2.2 test命令實例
test命令不會自己輸出執行的結果,配合$?查詢上一條命令是否執行成功,就能夠判斷是否存在這個文件或目錄.
2.2.1 判斷一個文件是否存在
-f 為判斷的對象是文件,0為存在,1為不存在
[root@znix ~]# test -f /clsn/clsn.txt
[root@znix ~]# echo $?
0
[root@znix ~]# test -f /clsn/clsn
[root@znix ~]# echo $?
1
2.2.2 判斷一個目錄是否存在
-d 為對目錄進行判斷,0為存在,1為不存在.
[root@znix ~]# test -d /znix
[root@znix ~]# echo $?
1
[root@znix ~]# test `-d /clsn/
[root@znix ~]# echo $?
0
2.3 使用 [ ] 進行判斷
⚠使用[ ]的時候注意中間的空格,兩邊都要有兩個空格
[ ]與test命令的功能相似,可以進行判斷,相比test命令更為便捷
2.3.1 [ ]判斷一個文件是否存在
與test命令一樣 [ ] 判斷的結果也0為存在,1為不存在
[root@znix ~]# [ -f /zinx.txt ]
[root@znix ~]# echo $?
1
[root@znix ~]# [ -f /root/clsn.txt ]
[root@znix ~]# echo $?
0
2.3.2 判斷成功后,執行下一個命令 &&
判斷文件/目錄是否存在,判斷成功執行后面的內容,輸出ok ;判斷失敗,不執行后面的命令.
[root@znix ~]# [ -f /clsn/znix.txt ] && echo "ok"
[root@znix ~]# [ -d /clsn ] && echo "ok"
ok
2.3.3 判斷不成功后執行下一條命令 ||
如果這個文件不存在,就創建 (使用 || ), || 表示前面的執行錯誤了,執行后面的命令.
[root@znix ~]# [ -f /clsn/znix.txt ] || touch /clsn/znix.txt
[root@znix ~]# ls -l /clsn/znix.txt
-rw-r--r-- 1 root root 0 Sep 20 10:31 /clsn/znix.txt
2.3.3.1 [示例1]如果/root/clsndir 目錄不存在就創建
[root@znix ~]# [ -d /root/clsndir ] || mkdir -p /root/clsndir
[root@znix ~]# ls -ld /root/clsndir
drwxr-xr-x 2 root root 4096 Sep 20 10:36 /root/clsndir
2.3.3.2 [示例2]如果/root/clsndir 目錄不存在,就創建這個目錄
使用 && ,前面的執行成功,執行后面的; ! 表示非,不存在.
[root@znix ~]# [ ! -d /root/clsndir/1 ] && mkdir -p /root/clsndir/1
[root@znix ~]# ll -d /root/clsndir/1
drwxr-xr-x 2 root root 4096 Sep 20 10:41 /root/clsndir/1
第3章 判斷在腳本的使用
3.1.1 中文示例(更好理解)
如果 [ 這個文件存在 ];然后
提示文件存在
否則
創建這個文件
果如
3.2 [示例]判斷文件是否存在,不存在就創建
3.2.1 第一步 按照格式書寫判斷語句
if [ -f /root/clsn.txt ];then
echo "文件存在"
else
touch /root/clsn.txt
fi
3.3 第二步 寫入腳本:
寫入腳本的時候,注意腳本的基本格式.
[root@znix ~]# vim /server/scripts/if.sh
#!/bin/bash
if [ -f /root/clsn.txt ];then
echo "文件存在"
else
touch /root/clsn.txt
fi
3.3.1 第三步 測試腳本
[root@znix ~]# sh /server/scripts/if.sh
文件存在
3.4 在腳本中進行判斷的格式
| 符號 |
參數 |
含義 |
英文 |
| > |
-gt |
大於 |
great than |
| >= |
-ge |
大於等於 |
great equal |
| < |
-lt |
小於 |
less than |
| <= |
-le |
小於等於 |
less than or equal |
| == |
-eq |
等於 |
equal |
| != |
-ne / ! -eq |
不等於 |
not equal |
3.5 [實例]如果cal2.sh腳本的參數個數不等於2,就顯示 "命令錯誤"
3.5.1 書寫腳本
!= 表示判斷兩個是否不相等,如果不想等就顯示命令錯誤
#/bin/bash
if [ $# != 2 ];then
echo "命令錯誤"
fi
3.5.2 對腳本進行測試.
當參數的個數為2的時候,不會輸出,個數不為二的時候輸出 命令錯誤
[root@znix ~]# sh /server/scripts/cal2.sh
命令錯誤
[root@znix ~]# sh /server/scripts/cal2.sh 1 2
[root@znix ~]# sh /server/scripts/cal2.sh 1 2 3
命令錯誤
3.6 修改之前的計算器,進行兩個數字的加減乘除,在計算器前面加上參數個數判斷。當輸入的參數是2個的時候執行計算,不為2的時候顯示參數錯誤.
3.6.1 書寫腳本
當輸入的參數不為2的時候 執行 echo "Usage: NUM1 NUM2", 然后執行 exit..
exit 表示前面的執行完成后就結束(跳出),不會再執行腳本后面的內容.
[root@znix ~]# vim /server/scripts/cal2.sh
#!/bin/bash
if [ $# -ne 2 ];then
echo "Usage: NUM1 NUM2"
exit
fi
a=$1
b=$2
awk -vh=$a -vz=$b 'BEGIN{print h/z}'
awk -vh=$a -vz=$b 'BEGIN{print h+z}'
awk -vh=$a -vz=$b 'BEGIN{print h-z}'
awk -vh=$a -vz=$b 'BEGIN{print h*z}'
3.6.2 測試腳本
當輸入的參數個數不為2的時候執行echo 命令
當輸入的參數個數為2的時候進行計算
[root@znix ~]# sh /server/scripts/cal2.sh
Usage: NUM1 NUM2 ##提示信息
[root@znix ~]# sh /server/scripts/cal2.sh 22 22
1
44
0
484
第4章 循環語句
4.1 [示例]修改系統時間為20170501到20170520,然后創建文件的名字為2017-05-01.txt
4.1.1 基礎姿勢
4.1.1.1 for循環可以從后面的數組中讀取內容進行操作
循環的格式 :
for hd in znix_{a..z}
do
echo $hd
done
4.1.1.2 執行for 循環語句
[root@znix ~]# for hd in znix_{a..z}
> do
> echo $hd
> done
znix_a
znix_b
znix_c
znix_d
……
znix_z
4.1.2 書寫循環語句
do里面可以兩條命令同時執行.
for hd in {01..20}
do
date -s "201705$hd"
touch /tmp/date/$(date +%F).txt
done
4.1.3 測試循環語句
[root@znix ~]# for hd in {01..20}
> do
> date -s "201705$hd"
> touch /tmp/date/$(date +%F).txt
> done
Mon May 1 00:00:00 CST 2017
Tue May 2 00:00:00 CST 2017
Wed May 3 00:00:00 CST 2017
……
Sat May 20 00:00:00 CST 2017
4.1.4 檢查執行結果
[root@znix ~]# ls /tmp/date/
2017-05-01.txt 2017-05-05.txt 2017-05-09.txt 2017-05-13.txt 2017-05-17.txt
2017-05-02.txt 2017-05-06.txt 2017-05-10.txt 2017-05-14.txt 2017-05-18.txt
2017-05-03.txt 2017-05-07.txt 2017-05-11.txt 2017-05-15.txt 2017-05-19.txt
2017-05-04.txt 2017-05-08.txt 2017-05-12.txt 2017-05-16.txt 2017-05-20.txt
4.2 [實例]優化linux開機啟動項目-for循環方法
4.2.1 第一步:確定目標
for name in 要關閉的服務的名字
do
chkconfig $name off
done
4.2.2 第二步:取出要關閉服務的名字
[root@znix ~]# chkconfig |egrep -v "sshd|network|crond|rsyslog|sysstat"|awk '{print $1}'
abrt-ccpp
abrtd
acpid
……
4.2.3 第三步 把名字與for循環結合
for name in `chkconfig |egrep -v "sshd|network|crond|rsyslog|sysstat"|awk '{print $1}'`
do
chkconfig $name off
done
第5章 腳本執行排錯
5.1 sh -x 顯示腳本詳細的執行過程
前面有 + 表示執行過的命令的
前面沒有東西,表示輸出到屏幕上的內容。
[root@znix ~]# sh -x /server/scripts/cal2.sh
+ '[' 0 -ne 2 ']'
+ echo 'Usage: NUM1 NUM2'
Usage: NUM1 NUM2
+ exit
5.1.1 檢查腳本運行中的錯誤
[root@znix ~]# sh -x /server/scripts/cal2.sh 10 20
+ '[' 2 -ne 2 ']'
+ a=10
+ b=20
+ awk -vh=10 -vz=20 'BEGIN{print h/z}'
0.5
+ awk -vh=10 -vz=20 'BEGIN{print h+z}'
30
+ awk -vh=10 -vz=20 'BEGIN{print h-z}'
-10
+ awk -vh=10 -vz=20 'BEGIN{print h*z}'
200
第6章 vim 快捷鍵
ctrl + v 按d批量刪除
ctrl + v 按x批量刪除
dd 刪除光標所在行
dG 刪除光標所在行到最后一行
D 光標所在位置到行尾的內容
x 刪除光標所在位置的一個字符
第7章 昨日回顧
7.1 【sed命令】刪除文件中的空行或只有空格的行。
7.1.1 文件內容
[root@znix ~]# cat -A test.txt
znix$
$
linux$
$
good$
$
n$
7.1.2 * 表示前一個字符出現了0次或以上
0次的時候即為^$ 表示空行,以上表示空格的行
[root@znix ~]# sed '/^ *$/d' test.txt
znix
linux
good
n
7.1.3 +表示連續出現至少一次
[root@znix ~]# sed -r '/^ +$|^$/d' test.txt
znix
linux
good
n
7.1.4 !表示取反
[root@znix ~]# sed -n '/^ *$/!p' test.txt
znix
linux
good
n
7.1.5 同樣用來取反
[root@znix ~]# sed -nr '/^$|^ +$/!p' test.txt
znix
linux
good
n
7.2 shell編程中的變量
7.2.1 特殊變量(shell腳本中)
$1,$2... 用來傳遞參數
$0 腳本文件的文件名
$# 腳本中參數的個數
$? 前一條命令是否執行成功
7.2.2 全局變量(環境變量)
常用的 LANG PATH PS1 ……
7.2.3 普通變量
自己定義的變量
7.3 shell編程中與用戶有關的環境變量的文件和目錄
/etc/profile
/etc/profile.d (目錄)
/etc/bashrc
~/.bashrc
~/.bash_profile
