linux計算機基礎之engineer DAY02
阿新 • • 發佈:2018-11-09
Shell指令碼
指令碼:一個可以執行的檔案,可實現某種功能
案例1:第一個Shell指令碼
[[email protected] ~]# vim /root/hello.sh
echo hello world
[[email protected] ~]# chmod +x /root/hello.sh #賦予執行許可權 [[email protected] ~]# /root/hello.sh #絕對路徑執行 規範Shell指令碼的一般組成
• #! 環境宣告(以下所有程式碼,有什麼程式執行翻譯)
• # 註釋文字
• 可執行程式碼 案例1:第一個Shell指令碼
[[email protected] ~]# cat /root/hello.sh
#!/bin/bash
echo hello world
cat /etc/redhat-release
uname -r
hostname
ifconfig | head -2 [[email protected] ~]# chmod +x /root/hello.sh [[email protected] ~]# /root/hello.sh #絕對路徑執行
重定向輸出 > :只收集前面命令正確輸出結果
2> :只收集前面命令錯誤輸出結果
&> :收集前面命令,正確與錯誤輸出結果 ]# echo 123 > /opt/1.txt
]# cat /opt/1.txt
]# cat /opt/a
]# cat /opt/1.txt /opt/a ]# cat /opt/1.txt /opt/a > /mnt/nsd.txt
]# cat /mnt/nsd.txt ]# cat /opt/1.txt /opt/a 2> /mnt/nsd.txt
]# cat /mnt/nsd.txt ]# cat /opt/1.txt /opt/a &> /mnt/nsd.txt
]# cat /mnt/nsd.txt ###############################################
案例3:書寫一個可以建立使用者的指令碼 /dev/null:黑洞裝置
[[email protected] ~]# vim /root/user.sh
#!/bin/bash
useradd nsd04 &> /dev/null
echo 使用者nsd04建立成功
echo 123 | passwd --stdin nsd04 &> /dev/null
echo 使用者nsd04密碼設定成功 [[email protected] ~]# /root/user.sh 為了增加指令碼靈活性,以及適應多變的需求所以使用變數 變數:會變化的量 類似於容器,以不變的名稱,儲存可以變化的值
– 方便以固定名稱重複使用某個值
變數名=值 [[email protected] ~]# vim /root/user.sh
#!/bin/bash
a=zhangsan #定義變數a儲存值zhangsan
useradd $a &> /dev/null #$a使用變數a儲存的值
echo 使用者$a建立成功
echo 123 | passwd --stdin $a &> /dev/null
echo 使用者$a密碼設定成功 [[email protected] ~]# /root/user.sh
定義/賦值變數
• 設定變數時的注意事項
– 等號兩邊不要有空格
– 變數名只能由字母/數字/下劃線組成,區分大小寫
– 變數名不能以數字開頭,不要使用關鍵字和特殊字元
– 若指定的變數名已存在,相當於為此變數重新賦值
• 基本格式
– 引用變數值:$變數名
– 檢視變數值:echo $變數名、echo ${變數名} [[email protected] ~]# a=rhel
[[email protected] ~]# echo $a
rhel
[[email protected] ~]# echo ${a}
rhel
[[email protected] ~]# echo $a7 [[email protected] ~]# echo ${a}7
rhel7
[[email protected] ~]#
############################################
' ':取消所有特殊意義字元,變為普通字元 $( ) 或 反撇號 ` ` : 將命令的輸出,作為引數直接參與下一條命令 [[email protected] ~]# rm -rf /opt/*
[[email protected] ~]# date +%F
[[email protected] opt]# cd /opt
[[email protected] opt]# mkdir `date +%F`
[[email protected] opt]# ls [[email protected] opt]# mkdir MySQL-`date +%F`
[[email protected] opt]# ls [[email protected] opt]# mkdir `hostname`
[[email protected] opt]# ls
[[email protected] opt]# mkdir nsd-$(date +%F)
[[email protected] opt]# ls ################################################
環境變數:變數名一般都大寫,由系統定義完成,並且賦值完成 USER=當前登陸系統的使用者名稱
[[email protected] /]# echo $USER
root
[[email protected] /]# su - nsd01
[[email protected] ~]$ echo $USER
nsd01
[[email protected] ~]$ exit
logout
[[email protected] /]# su - student
[[email protected] ~]$ echo $USER
student
[[email protected] ~]$ exit
logout
[[email protected] /]#
位置變數:由系統定義完成,並且賦值完成
• 在執行指令碼時,提供的命令列引數
– 表示為 $n,n為序號
– $1、$2、.. .. ${10}、${11}、.. ..
[[email protected] /]# vim /root/user.sh
#!/bin/bash
useradd $1 &> /dev/null
echo 使用者$1建立成功
echo 123 | passwd --stdin $1 &> /dev/null
echo 使用者$1密碼設定成功
[[email protected] /]# /root/user.sh zhangsan
[[email protected] /]# /root/user.sh tom
[[email protected] /]# /root/user.sh harry
[[email protected] /]# vim /root/1.sh
#!/bin/bash
cat -n $1 | head -$2
echo 顯示$1檔案的頭$2行 [[email protected] /]# /root/1.sh /etc/passwd 4
################################################
讓使用者體驗更好,降低指令碼使用難度,讓指令碼執行產生互動 read :
1.產生互動,會等待使用者輸入內容
2.記錄使用者在鍵盤上的輸入
3.將使用者在鍵盤上的輸入,賦值給變數儲存 -p '螢幕輸出資訊' [[email protected] /]# vim /root/user.sh
#!/bin/bash
read -p '請輸入您要建立的使用者名稱:' a
useradd $a &> /dev/null
echo 使用者$a建立成功
echo 123 | passwd --stdin $a &> /dev/null
echo 使用者$a密碼設定成功
[[email protected] /]# #################################################
預定義變數:由系統定義完成,並且賦值完成 $# 已載入的位置變數的個數(統計一共輸入多少個位置變數)
$* 輸出所有位置變數的值 $? 程式退出後的狀態值,0表示正常,其他值異常 [[email protected] /]# cat /root/2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $# 統計一共輸入了多少個位置變數的值
echo $* 輸出所有位置變數的值 [[email protected] /]# /root/2.sh [[email protected] /]# /root/2.sh dc tc dz tz [[email protected] /]# useradd natasha
[[email protected] /]# echo $? #為0代表上條命令成功
[[email protected] /]# useradd natasha
[[email protected] /]# echo $? #非0值代表上條命令失敗 [[email protected] /]# id natasha
uid=1016(natasha) gid=1016(natasha) 組=1016(natasha)
[[email protected] /]# echo $? #為0代表上條命令成功
0
[[email protected] /]# id hahaxixi
id: hahaxixi: no such user
[[email protected] /]# echo $? #非0值代表上條命令失敗
1 #################################################
條件測試及選擇 [ 測試表達式 ] 每一部分之間都要有空格 -r:文件存在,且對文件具備讀取許可權為真
-w:文件存在,且對文件具備寫許可權為真
-x:文件存在,且對文件具備執行許可權為真
• 檢查檔案狀態
-e:文件存在為真
-d:文件存在,且為目錄為真
-f:文件存在,且為檔案為真 [[email protected] /]# [ -f /etc/passwd ]
[[email protected] /]# echo $?
[[email protected] /]# [ -f /etc/ ]
[[email protected] /]# echo $? [[email protected] /]# [ -d /etc/passwd ]
[[email protected] /]# echo $?
[[email protected] /]# [ -d /etc/]
[[email protected] /]# echo $? • 比較整數大小
-gt:大於 #greater than
-ge:大於等於 greater equal -eq:等於 equal
-ne:不等於 no equal
-le:小於等於 little equal
-lt:小於 little
[[email protected] /]# [ 1 -eq 1 ]
[[email protected] /]# echo $? [[email protected] /]# [ 1 -ge 1 ]
[[email protected] /]# echo $? [[email protected] /]# [ 1 -gt 1 ]
[[email protected] /]# echo $?
• 字串比對
== :相等一致為真
!= :不相等為真
[[email protected] /]# [ student == root ]
[[email protected] /]# echo $?
1
[[email protected] /]# [ student != root ]
[[email protected] /]# echo $?
0
[[email protected] /]# [ $USER == root ]
[[email protected] /]# echo $?
0
[[email protected] /]#
############################################# if雙分支處理 if [條件測試];then
命令序列xx
else
命令序列yy
fi [[email protected] /]# vim /root/if01.sh
#!/bin/bash
if [ $1 -eq 2 ];then
echo hello
else
echo hi
fi
[[email protected] /]# /root/if01.sh 1
[[email protected] /]# /root/if01.sh 2 [[email protected] /]# cat /root/if02.sh
#!/bin/bash
if [ $# -eq 0 ];then
echo 您沒有輸入任何的命令列引數
else
echo 您輸入了命令列引數
echo 您一共輸入了$#個引數
echo 它們的值為$*
fi [[email protected] /]# /root/if02.sh [[email protected] /]# /root/if02.sh dc tc dz tz
if多分支處理 if [條件測試1];then
命令序列xx
elif [條件測試2];then
命令序列yy
elif [條件測試3];then
命令序列aa
..........
else
命令序列zz
fi
案例:書寫一個成績指令碼
使用者輸入考試成績,利用 read -p 手法進行獲得使用者成績
如果成績 大於等於 90 ,則輸出 優秀
如果成績 大於等於 80 ,則輸出 良好
如果成績 大於等於 70 ,則輸出 一般
如果成績 大於等於 60 ,則輸出 合格
如果以上條件均不滿足,則輸出 再牛的肖邦也彈不出哥的悲傷! [[email protected] /]# vim /root/if04.sh
#!/bin/bash
read -p '請輸入您的成績:' num
if [ $num -ge 90 ];then
echo 優秀
elif [ $num -ge 80 ];then
echo 良好
elif [ $num -ge 70 ];then
echo 一般
elif [ $num -ge 60 ];then
echo 合格
else
echo '再牛的肖邦,也彈不出哥的悲傷!'
fi
[[email protected] /]# /root/if04.sh #########################################
for迴圈結構 for 變數名 in 值列表
do
命令序列
done
[[email protected] /]# vim /root/for01.sh
#!/bin/bash
for a in zhangsan lisi wangwu dc tc dz tz
do
useradd $a &> /dev/null
echo $a建立成功
done
[[email protected] /]# /root/for01.sh
建立使用者 nsd1~nsd50
造數工具: {起始點..結束點} {1..50} [[email protected] /]# rm -rf /opt/*
[[email protected] /]# touch /opt/nsd{1..10}.txt
[[email protected] /]# ls /opt/ [[email protected] /]# cat /root/for01.sh
#!/bin/bash
for a in {1..50}
do
useradd nsd$a &> /dev/null
echo nsd$a建立成功
done
[[email protected] /]#
################################################# 案例:書寫一個判斷IP通訊的指令碼 使用者輸入IP地址,利用read -p 方式獲得使用者輸入的IP地址
判斷如果本機可以與該IP地址通訊,則輸出 可以通訊
判斷如果本機不可以與該IP地址通訊,則輸出 無法可以通訊 [[email protected] /]# vim /root/ip.sh
#!/bin/bash
read -p '請輸入您要測試的IP地址:' ip
ping -c 2 $ip &> /dev/null
if [ $? -eq 0 ];then
echo $ip可以通訊
else
echo $ip無法通訊
fi
[[email protected] /]#
###########################################
案例1:第一個Shell指令碼
[[email protected] ~]# vim /root/hello.sh
echo hello world
[[email protected] ~]# chmod +x /root/hello.sh #賦予執行許可權 [[email protected] ~]# /root/hello.sh #絕對路徑執行 規範Shell指令碼的一般組成
• #! 環境宣告(以下所有程式碼,有什麼程式執行翻譯)
• # 註釋文字
• 可執行程式碼 案例1:第一個Shell指令碼
[[email protected] ~]# cat /root/hello.sh
#!/bin/bash
echo hello world
cat /etc/redhat-release
uname -r
hostname
ifconfig | head -2 [[email protected] ~]# chmod +x /root/hello.sh [[email protected]
重定向輸出 > :只收集前面命令正確輸出結果
2> :只收集前面命令錯誤輸出結果
&> :收集前面命令,正確與錯誤輸出結果 ]# echo 123 > /opt/1.txt
]# cat /opt/1.txt
]# cat /opt/a
]# cat /opt/1.txt /opt/a ]# cat /opt/1.txt /opt/a > /mnt/nsd.txt
]# cat /mnt/nsd.txt ]# cat /opt/1.txt /opt/a 2> /mnt/nsd.txt
]# cat /mnt/nsd.txt ]# cat /opt/1.txt /opt/a &> /mnt/nsd.txt
]# cat /mnt/nsd.txt ###############################################
案例3:書寫一個可以建立使用者的指令碼 /dev/null:黑洞裝置
#!/bin/bash
useradd nsd04 &> /dev/null
echo 使用者nsd04建立成功
echo 123 | passwd --stdin nsd04 &> /dev/null
echo 使用者nsd04密碼設定成功 [[email protected] ~]# /root/user.sh 為了增加指令碼靈活性,以及適應多變的需求所以使用變數 變數:會變化的量 類似於容器,以不變的名稱,儲存可以變化的值
– 方便以固定名稱重複使用某個值
變數名=值 [[email protected] ~]# vim /root/user.sh
#!/bin/bash
a=zhangsan #定義變數a儲存值zhangsan
useradd $a &> /dev/null #$a使用變數a儲存的值
echo 使用者$a建立成功
echo 123 | passwd --stdin $a &> /dev/null
echo 使用者$a密碼設定成功 [[email protected] ~]# /root/user.sh
定義/賦值變數
• 設定變數時的注意事項
– 等號兩邊不要有空格
– 變數名只能由字母/數字/下劃線組成,區分大小寫
– 變數名不能以數字開頭,不要使用關鍵字和特殊字元
– 若指定的變數名已存在,相當於為此變數重新賦值
• 基本格式
– 引用變數值:$變數名
– 檢視變數值:echo $變數名、echo ${變數名} [[email protected] ~]# a=rhel
[[email protected] ~]# echo $a
rhel
[[email protected] ~]# echo ${a}
rhel
[[email protected] ~]# echo $a7 [[email protected] ~]# echo ${a}7
rhel7
[[email protected] ~]#
############################################
' ':取消所有特殊意義字元,變為普通字元 $( ) 或 反撇號 ` ` : 將命令的輸出,作為引數直接參與下一條命令 [[email protected] ~]# rm -rf /opt/*
[[email protected] ~]# date +%F
[[email protected] opt]# cd /opt
[[email protected] opt]# mkdir `date +%F`
[[email protected] opt]# ls [[email protected] opt]# mkdir MySQL-`date +%F`
[[email protected] opt]# ls [[email protected] opt]# mkdir `hostname`
[[email protected] opt]# ls
[[email protected] opt]# mkdir nsd-$(date +%F)
[[email protected] opt]# ls ################################################
環境變數:變數名一般都大寫,由系統定義完成,並且賦值完成 USER=當前登陸系統的使用者名稱
[[email protected] /]# echo $USER
root
[[email protected] /]# su - nsd01
[[email protected] ~]$ echo $USER
nsd01
[[email protected] ~]$ exit
logout
[[email protected] /]# su - student
[[email protected] ~]$ echo $USER
student
[[email protected] ~]$ exit
logout
[[email protected] /]#
位置變數:由系統定義完成,並且賦值完成
• 在執行指令碼時,提供的命令列引數
– 表示為 $n,n為序號
– $1、$2、.. .. ${10}、${11}、.. ..
[[email protected] /]# vim /root/user.sh
#!/bin/bash
useradd $1 &> /dev/null
echo 使用者$1建立成功
echo 123 | passwd --stdin $1 &> /dev/null
echo 使用者$1密碼設定成功
[[email protected] /]# /root/user.sh zhangsan
[[email protected] /]# /root/user.sh tom
[[email protected] /]# /root/user.sh harry
[[email protected] /]# vim /root/1.sh
#!/bin/bash
cat -n $1 | head -$2
echo 顯示$1檔案的頭$2行 [[email protected] /]# /root/1.sh /etc/passwd 4
################################################
讓使用者體驗更好,降低指令碼使用難度,讓指令碼執行產生互動 read :
1.產生互動,會等待使用者輸入內容
2.記錄使用者在鍵盤上的輸入
3.將使用者在鍵盤上的輸入,賦值給變數儲存 -p '螢幕輸出資訊' [[email protected] /]# vim /root/user.sh
#!/bin/bash
read -p '請輸入您要建立的使用者名稱:' a
useradd $a &> /dev/null
echo 使用者$a建立成功
echo 123 | passwd --stdin $a &> /dev/null
echo 使用者$a密碼設定成功
[[email protected] /]# #################################################
預定義變數:由系統定義完成,並且賦值完成 $# 已載入的位置變數的個數(統計一共輸入多少個位置變數)
$* 輸出所有位置變數的值 $? 程式退出後的狀態值,0表示正常,其他值異常 [[email protected] /]# cat /root/2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $# 統計一共輸入了多少個位置變數的值
echo $* 輸出所有位置變數的值 [[email protected] /]# /root/2.sh [[email protected] /]# /root/2.sh dc tc dz tz [[email protected] /]# useradd natasha
[[email protected] /]# echo $? #為0代表上條命令成功
[[email protected] /]# useradd natasha
[[email protected] /]# echo $? #非0值代表上條命令失敗 [[email protected] /]# id natasha
uid=1016(natasha) gid=1016(natasha) 組=1016(natasha)
[[email protected] /]# echo $? #為0代表上條命令成功
0
[[email protected] /]# id hahaxixi
id: hahaxixi: no such user
[[email protected] /]# echo $? #非0值代表上條命令失敗
1 #################################################
條件測試及選擇 [ 測試表達式 ] 每一部分之間都要有空格 -r:文件存在,且對文件具備讀取許可權為真
-w:文件存在,且對文件具備寫許可權為真
-x:文件存在,且對文件具備執行許可權為真
• 檢查檔案狀態
-e:文件存在為真
-d:文件存在,且為目錄為真
-f:文件存在,且為檔案為真 [[email protected] /]# [ -f /etc/passwd ]
[[email protected] /]# echo $?
[[email protected] /]# [ -f /etc/ ]
[[email protected] /]# echo $? [[email protected] /]# [ -d /etc/passwd ]
[[email protected] /]# echo $?
[[email protected] /]# [ -d /etc/]
[[email protected] /]# echo $? • 比較整數大小
-gt:大於 #greater than
-ge:大於等於 greater equal -eq:等於 equal
-ne:不等於 no equal
-le:小於等於 little equal
-lt:小於 little
[[email protected] /]# [ 1 -eq 1 ]
[[email protected] /]# echo $? [[email protected] /]# [ 1 -ge 1 ]
[[email protected] /]# echo $? [[email protected] /]# [ 1 -gt 1 ]
[[email protected] /]# echo $?
• 字串比對
== :相等一致為真
!= :不相等為真
[[email protected] /]# [ student == root ]
[[email protected] /]# echo $?
1
[[email protected] /]# [ student != root ]
[[email protected] /]# echo $?
0
[[email protected] /]# [ $USER == root ]
[[email protected] /]# echo $?
0
[[email protected] /]#
############################################# if雙分支處理 if [條件測試];then
命令序列xx
else
命令序列yy
fi [[email protected] /]# vim /root/if01.sh
#!/bin/bash
if [ $1 -eq 2 ];then
echo hello
else
echo hi
fi
[[email protected] /]# /root/if01.sh 1
[[email protected] /]# /root/if01.sh 2 [[email protected] /]# cat /root/if02.sh
#!/bin/bash
if [ $# -eq 0 ];then
echo 您沒有輸入任何的命令列引數
else
echo 您輸入了命令列引數
echo 您一共輸入了$#個引數
echo 它們的值為$*
fi [[email protected] /]# /root/if02.sh [[email protected] /]# /root/if02.sh dc tc dz tz
if多分支處理 if [條件測試1];then
命令序列xx
elif [條件測試2];then
命令序列yy
elif [條件測試3];then
命令序列aa
..........
else
命令序列zz
fi
案例:書寫一個成績指令碼
使用者輸入考試成績,利用 read -p 手法進行獲得使用者成績
如果成績 大於等於 90 ,則輸出 優秀
如果成績 大於等於 80 ,則輸出 良好
如果成績 大於等於 70 ,則輸出 一般
如果成績 大於等於 60 ,則輸出 合格
如果以上條件均不滿足,則輸出 再牛的肖邦也彈不出哥的悲傷! [[email protected] /]# vim /root/if04.sh
#!/bin/bash
read -p '請輸入您的成績:' num
if [ $num -ge 90 ];then
echo 優秀
elif [ $num -ge 80 ];then
echo 良好
elif [ $num -ge 70 ];then
echo 一般
elif [ $num -ge 60 ];then
echo 合格
else
echo '再牛的肖邦,也彈不出哥的悲傷!'
fi
[[email protected] /]# /root/if04.sh #########################################
for迴圈結構 for 變數名 in 值列表
do
命令序列
done
[[email protected] /]# vim /root/for01.sh
#!/bin/bash
for a in zhangsan lisi wangwu dc tc dz tz
do
useradd $a &> /dev/null
echo $a建立成功
done
[[email protected] /]# /root/for01.sh
建立使用者 nsd1~nsd50
造數工具: {起始點..結束點} {1..50} [[email protected] /]# rm -rf /opt/*
[[email protected] /]# touch /opt/nsd{1..10}.txt
[[email protected] /]# ls /opt/ [[email protected] /]# cat /root/for01.sh
#!/bin/bash
for a in {1..50}
do
useradd nsd$a &> /dev/null
echo nsd$a建立成功
done
[[email protected] /]#
################################################# 案例:書寫一個判斷IP通訊的指令碼 使用者輸入IP地址,利用read -p 方式獲得使用者輸入的IP地址
判斷如果本機可以與該IP地址通訊,則輸出 可以通訊
判斷如果本機不可以與該IP地址通訊,則輸出 無法可以通訊 [[email protected] /]# vim /root/ip.sh
#!/bin/bash
read -p '請輸入您要測試的IP地址:' ip
ping -c 2 $ip &> /dev/null
if [ $? -eq 0 ];then
echo $ip可以通訊
else
echo $ip無法通訊
fi
[[email protected] /]#
###########################################