linux學習筆記--工程師技術:shell腳本基礎
Shell腳本
腳本:可以執行文件,運行後可以實現某種功能(命令的堆積,非交互)
規範Shell腳本的一般組成
#! 環境聲明(Sha-Bang)
# 註釋文本
可執行代碼
#!/bin/bash #環境聲明,聲明寫的腳本是bash這個程序翻譯的
一、書寫第一腳本程序
[root@server0 ~]# vim /root/1.sh
#!/bin/bash
echo hello world
hostname
cat /etc/redhat-release
ifconfig | head -2 | tail -1
[root@server0 ~]# /root/1.sh
二、書寫為Server0自動搭建Yum的腳本
[root@server0 ~]# vim /root/yum.sh #要註意排版,echo裏的內容要頂行寫,echo 後的‘要在同一行
#!/bin/bash
rm -rf /etc/yum.repos.d/*
echo ‘[dvd]
name=dvd
baseurl=http://172.25.254.254/content/rhel7.0/x86_64/dvd/
enabled=1
gpgcheck=0‘ > /etc/yum.repos.d/haha.repo
yum clean all
yum repolist
[root@server0 ~]# /root/1.sh #顯示權限不夠,因為vim下寫的都是普通的文本,需要賦予x執行權限
-bash: /root/1.sh: 權限不夠
[root@server0 ~]# chmod +x /root/yum.sh
[root@server0 ~]# /root/yum.sh
管道傳遞
使用 | 管道操作
– 將前一條命令的標準輸出交給後一條命令處理
三、重定向輸出
>:只收集前面命令的正確輸出,錯誤的顯示在命令行
2>:只收集前面命令的錯誤輸出,正確的顯示在命令行
&>:收集前面命令的錯誤與正確輸出,不顯示在命令行
[root@server0 ~]# echo 123 > /opt/1.txt
[root@server0 ~]# cat /opt/1.txt
[root@server0 ~]# cat /opt/1.txt /etc/
[root@server0 ~]# cat /opt/1.txt /etc/ > /opt/a.txt
[root@server0 ~]# cat /opt/a.txt
[root@server0 ~]# cat /opt/1.txt /etc/ 2> /opt/a.txt
[root@server0 ~]# cat /opt/a.txt
[root@server0 ~]# cat /opt/1.txt /etc/ &> /opt/a.txt
[root@server0 ~]# cat /opt/a.txt
-------------------------------------------------------------------------------------------
三、書寫創建用戶並設置密碼的腳本
[root@server0 ~]# vim /root/user.sh
#!/bin/bash
useradd test06
echo 123 | passwd --stdin test06
[root@server0 ~]# chmod +x /root/user.sh
[root@server0 ~]# /root/user.sh
更改用戶 test06 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。
要使其不顯示信息
/dev/null #Linux黑洞設備,專用於收集不要的輸出結果
[root@server0 ~]# vim /root/user.sh
#!/bin/bash
useradd test06 &> /dev/null
echo test06創建成功
echo 123 | passwd --stdin test06 &> /dev/null
echo test06密碼設置成功
[root@server0 ~]# chmod +x /root/user.sh
[root@server0 ~]# /root/user.sh
test06創建成功
test06密碼設置成功
變量:為了增加腳本的適用環境的能力,增加腳本的靈活度,方便。
變量: 容器,以不變的名稱,儲存變化的值
變量名=變化的值
使用變量: $變量名
為了降低腳本使用難度,可以產生交互
read :可以產生交互,將鍵盤輸入的內容賦值給變量
[root@server0 ~]# vim /root/user.sh
#!/bin/bash
read -p ‘請輸入您要建立的用戶:‘ user
read -p ‘請輸入您要設置的密碼:‘ pass
useradd $user &> /dev/null
echo $user創建成功
echo $pass | passwd --stdin $user &> /dev/null
echo $user密碼設置成功
[root@server0 ~]# /root/user.sh
請輸入您要創建的帳號:kobe
請輸入您要設置的密碼:248
kobe創建成功
kobe密碼設置成功
-------------------------------------------------------------------------------------------
什麽是變量
以不變的名稱存放的可能會變化的值
– 變量名=變量值
– 方便以固定名稱重復使用某個值
– 提高對任務需求、運行環境變化的適應能力
設置變量時的註意事項
– 若指定的變量名已存在,相當於為此變量重新賦值
– 等號兩邊不要有空格
– 變量名由字母/數字/下劃線組成,區分大小寫
– 變量名不能以數字開頭,不要使用關鍵字和特殊字符
基本格式
– 引用變量值:$變量名
– 查看變量值:echo $變量名,echo ${變量名}
變量的種類
位置變量
在執行腳本時提供的命令行參數(非交互式傳值)
$加數字($1、$2、$3.....):腳本文件名後面帶有參數的默認變量
[root@server0 ~]# vim /root/2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo ${10} #顯示超過兩位數的值要加{}
echo ${11}
echo $21 #不加{}則顯示前一位的值再加後一位的值
[root@server0 ~]# /root/2.sh haha benniu xixi hehe lele dc tc dz tz 100 200
haha
benniu
xixi
100 #顯示第十個值為100
200 #顯示第十個值為200
benniu1 #顯示第二個值加個1為benniu1
[root@server0 ~]# vim /root/3.sh
#!/bin/bash
cat -n $1 | head -$2
[root@server0 ~]# /root/3.sh /etc/passwd 2
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
預定義變量
用來保存腳本程序的執行信息
– 直接使用這些變量
– 不能直接為這些變量賦值
$# 已加載的位置變量的個數
$* 所有位置變量的值
$? 程序退出後的狀態值,0表示正常,其他值異常
[root@server0 ~]# vim /root/2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
echo ${11}
echo $#
echo $*
[root@server0 ~]# /root/2.sh 1 2 3 4 5 6 7 8 9 10 11
1
2
3
10
11
21
11 #顯示已加載的位置變量的個數為11
1 2 3 4 5 6 7 8 9 10 11 #顯示所有位置變量的值
----------------------------------------------------------------------------------------
運算
[root@server0 ~]# expr 10 / 3
[root@server0 ~]# expr 10 \* 3 #單獨*顯示語法錯誤,前面加\表示乘號
[root@server0 ~]# expr 1 + 2
[root@server0 ~]# expr 3 - 1
[root@server0 ~]# expr 10 % 3 #取余數 運算
$() :將()裏命令的輸出結果,作為參數顯示
[root@server0 opt]# date
[root@server0 opt]# date +%F #只顯示年月日
[root@server0 opt]# cd /opt
[root@server0 opt]# mkdir $(date +%F)
[root@server0 opt]# ls
2017-11-07
[root@server0 opt]# mkdir mydir-$(date +%F)
[root@server0 opt]# ls
2017-11-07 mydir-2017-11-07
[root@server0 opt]# mkdir MariaDB-$(date +%F)
[root@server0 opt]# ls
2017-11-07 MariaDB-2017-11-07 mydir-2017-11-07
[root@server0 opt]# mkdir $(hostname)-$(date +%F)
[root@server0 opt]# ls
2017-11-07 mydir-2017-11-07 MariaDB-2017-11-07 server0.example.com-2017-11-07
-------------------------------------------------------------------------------------------
常用的測試選項
檢查文件狀態
-e:文檔存在為真
-d:文檔存在且為目錄為真
-f:文檔存在且為文件為真
-r:文檔存在且有讀取權限為真
-w:文檔存在且有寫入權限為真
-x:文檔存在且有執行權限為真
比較整數大小(帶e都有等於二字,g代表大於,l代表小於)
-gt:大於
-ge:大於等於
-eq:等於
-ne:不等於
-lt:小於
-le:小於等於
字符串比對
== :相等
!=:不相等
----------------------------------------------------------------------------------------
if單分支語句
if [ 條件測試 ] ; then #[]裏一定要有空格
命令序列xx
else
命令序列yy
fi
[root@server0 /]# vim /root/5.sh
#!/bin/bash
if [ $1 -eq $2 ];then
echo hello
else
echo hi
fi
[root@server0 /]# /root/5.sh 1 1
hello
[root@server0 /]# /root/5.sh 1 2
hi
請書寫一個腳本:
用戶輸入一個IP地址(read),判斷是否可以與該IP地址通信,能通則輸出 "IP ok" 否則 輸出 "IP no"
[root@server0 /]# vim /root/6.sh
#!/bin/bash
read -p ‘請輸入一個IP地址:‘ ip #變量為ip
ping -c 2 $ip &> /dev/null
if [ $? -eq 0 ];then
echo ${ip} ok
else
echo ${ip} no
fi
[root@server0 /]# /root/6.sh
請輸入一個IP地址:127.0.0.1
127.0.0.1 ok
[root@server0 ~]# /root/6.sh
請輸入一個IP地址:1.1.1.1
1.1.1.1 no
-----------------------------------------------------------------------------------------
if多分支語句
if [條件測試1] ; then
命令序列xx
elif [條件測試2] ; then
命令序列yy
else
命令序列zz
fi
成績 大於等於90 優秀
大於等於80 良好
大於等於70 及格
大於等於60 仍需努力
60以下 在牛的肖邦,也彈不出哥憂傷
[root@server0 ~]# vim /root/8.sh
#!/bin/bash
read -p ‘請輸入您的成績:‘ num
if [ $num -gt 100 ];then #大於100分
echo 成績有誤
elif [ $num -lt 0 ];then #小於0分
echo 成績有誤
elif [ $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
-----------------------------------------------------------------------------------------
在 server0 上創建 /root/foo.sh 腳本
1)當運行/root/foo.sh redhat,輸出為fedora
2)當運行/root/foo.sh fedora,輸出為redhat
3)當沒有任何參數或者參數不是 redhat 或者
fedora時,其錯誤輸出產生以下信息:
/root/foo.sh redhat|fedora
‘ ‘:把所有的特殊字符,當作普通文本字符輸出
[root@server0 ~]# vim /root/foo.sh
#!/bin/bash
if [ $1 == redhat ];then
echo fedora
elif [ $1 == fedora ];then
echo redhat
else
echo ‘/root/foo.sh redhat|fedora‘
fi
[root@server0 ~]# /root/foo.sh redhat
[root@server0 ~]# /root/foo.sh fedora
[root@server0 ~]# /root/foo.sh haha
#!/bin/bash
if [ $# -eq 0 ];then #表示腳本文件後位置變量的個數為0時,即沒有任何參數(不輸入參數)
echo ‘/root/foo.sh redhat|fedora‘
elif [ $1 == redhat ];then
echo fedora
elif [ $1 == fedora ];then
echo redhat
else
echo ‘/root/foo.sh redhat|fedora‘
fi
" ":可以將 “沒有” 變成 “ 空值”
#!/bin/bash
if [ "$1" == redhat ];then
echo fedora
elif [ "$1" == fedora ];then
echo redhat
else
echo ‘/root/foo.sh redhat|fedora‘ >&2 #將正確輸出變成錯誤
exit 2 #腳本退出返回值,即上一行命令為錯時echo$?顯示不為0的指定值2
fi
-------------------------------------------------------------------------------------------
for循環結構
循環結構:將反復執行的語句,循環去執行
for 變量名 in 值列表
do
命令序列
done
[root@server0 /]# vim /root/for.sh
#!/bin/bash
for a in 1 2 3 4 5
do
useradd nsd$a
echo nsd$a創建成功
done
[root@server0 /]# vim /root/for02.sh
#!/bin/bash
for a in 1 2 3 4 5
do
echo hello
done
-------------------------------------------------------------------------------------------
案例5:編寫一個批量添加用戶腳本
在 server0 上創建 /root/batchusers 腳本
1)此腳本要求提供用戶名列表文件作為參數
2)如果沒有提供參數,此腳本應該給出提示
Usage: /root/batchusers,退出並返回相應值
3)如果提供一個不存在的文件,此腳本應該給出提
示 Input file not found,退出並返回相應值
4)新用戶的登錄Shell為 /bin/false,無需設置密碼
5)用戶列表測試文件:
http://classroom/pub/materials/userlist
# wget http://classroom/pub/materials/userlist
[root@server0 /]# vim /root/batchusers
#!/bin/bash
if [ $# -eq 0 ];then
echo ‘Usage: /root/batchusers‘ >&2
exit 1
fi
if [ ! -e $1 ];then # !表示不存在
echo ‘Input file not found‘ >&2
exit 2
fi
for a in $(cat $1)
do
useradd -s /bin/false $a
echo $a創建成功
done
-----------------------------------------------------------------------------------------
#!/bin/bash
if [ $# -eq 0 ];then
echo ‘Usage: /root/batchusers‘ >&2
exit 1
fi
if [ -e $1 ];then
for a in $(cat $1)
do
useradd -s /bin/false $a
echo $a創建成功
done
else
echo ‘Input file not found‘ >&2
exit 2
fi
linux學習筆記--工程師技術:shell腳本基礎