shell腳本基礎及編程練習

shell基礎語法

變量
變量定義:命名的內存空間,變量指向內存空間,引用的時候直接調用變量而不需考慮具體的內存空間,系統中echo $可以列出很多變量,引用的時候加$。重新定義變量時,變量名稱不變,變量的指針發生變化,重新指向新的內存空間,原來的內存空間會被系統收回。

變量類型:
1、字符
2、數值
變量作用:
1、數據存儲格式
2、參與的運算
3、表示的數據范圍
變量命名法則:
1、不能使用程序中的保留字:例如if, for,內部外部命令
使用type顯示if is a shell keyword(關鍵字)
2、只能使用數字、字母及下劃線,且不能以數字開頭
n1可以,1n就不行
3、見名知義
看見名字就能知道含義。
4、統一命名規則:駝峰命名法
首字母大寫,單詞兩個以上,首字母都大寫
bash中變量的種類
根據變量的生效范圍等標準劃分下面變量類型:
局部變量(普通變量):
生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效,上級shell進程變量影響不了下級,下級shell進程變量影響不了上級。
定義變量: [set]Var_Name=”Value”
引用變量: ${Var_Name}
刪除變量: unset Var_Name
環境(全局)變量:
生效范圍為當前shell進程及其子進程,允許上級向下級傳,下級可以臨時更改,更改不能上傳到父進程
定義方法:
1.直接定義 export name=VALUE,declare -x name=VALUE
2.間接定義,先定義局部變量,然后再定義全局變量。
引用變量: ${name}
刪除變量:unset name
bash內建的環境變量:
PATH 命令的存放路徑
SHELL 系統的默認shell
USER 當前的用戶
UID root的uid
HOME 用戶家目錄
PWD 當前工作目錄
SHLVL bash嵌套深度
LANG 語系
MAIL 用戶的郵箱目錄
HOSTNAME 主機名
HISTSIZE 歷史命令的最大存放數
— 上一個命令的最后的參數
只讀和位置變量
只讀變量:只能聲明,但不能修改和刪除(程序結束變量也就結束,exit)
聲明只讀變量:
readonly name
declare -r name(readonly -p) 顯示系統中的常量
查看只讀變量:
readonly –p
位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數,通過輸入的參數,實現更為強大的功能。
$1, $2, …:對應第1、第2等參數,shift [n]換位置。
$0: 命令本身。
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
$@ $* 只在被雙引號包起來的時候才會有差異
set — 清空所有位置變量
例如:backup.sh a b c $1為a,$2為b,$3為c,$*為a b c,$#為3,$0為 backup.sh(默認帶路徑)
示例:復制本機的文件到遠程主機可以用位置參數實現
scp $* wang@172.20.102.77:/home/wang/bin
格式:scp 要發送的文件 登陸遠程主機的身份@遠程主機的IP:要發送到的目錄
寫個腳本scp.sh:
#!/bin/bash
echo “copy will be start”
scp $* wang@172.20.102.77:/home/wang/bin
echo “copy is finished”
以后復制文件時直接./scp.sh f1…即可
退出狀態
進程使用退出狀態來報告成功或失敗
0 代表成功,1-255代表失敗
$? 變量保存最近的命令退出狀態
bash自定義退出狀態碼
exit [n]:自定義退出狀態碼 將狀態碼傳到$?
注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字
注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行的最后一條命令的狀態碼
運行腳本時,實際上是在當前shell中創建了子shell。在父進程中創建的局部變量在腳本中無效。讓其有效要定義成全局變量export

算術運算
bash中的算術運算:help let
+, -, *, /, %取模(取余), **(乘方)
實現算術運算:
(1) let var=算術表達式 例如:x=10;y=20;let z=x+y(加上$也行);echo $z 輸出30
(2) var=$[算術表達式] 例如:m=2;n=3;sum=$[m+n]或者sum=$[$m+$n];echo $sum 輸出5
(3) var=$((算術表達式)) 例如:m=2;n=3;sum=$((m+n))或者sum=$(($m+$n));echo $sum 輸出5
(4) var=$(expr arg1 arg2 arg3 …) 例如:sum=$(expr 1 + 3);echo $sum 輸出4
(5) declare –i var = 數值 例如:declare -i x=10;declare -i y=20;declare -i z=x+y;echo $z 輸出為30
(6) echo ‘算術表達式’ | bc
取模:let result=100%或者result=$[100%3];echo $result 輸出為1
例子:使文字帶隨機的顏色
COLOR=$[RANDOM%7+31];echo -e “\e[1;${COLOR}mcolor\e[0m”
COLOR=$((RANDOM%7+31));echo -e “\e[1;${COLOR}mcolor\e[0m”
乘法符號有些場景中需要轉義,如*
bash有內建的隨機數生成器:$RANDOM(0-32767)
echo $[$RANDOM%50] :0-49之間隨機數
expr為命令可以直接進行加減乘除運算,需注意空格例如expr 1 + 2 expr 3 \* 2(需要轉義) expr 3 / 2(只能取整,沒有余數)
算數運算練習
1、編寫腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和
#!/bin/bash
ct1=”/etc/passwd”
ct2=”tail -n1″
ct3=”cut -d “:” -f3″
number1=`head -n$1 ${ct1}|${ct2}|${ct3}`
number2=`head -n$2 ${ct1}|${ct2}|${ct3}`
sum=$[number1+number2]
echo “the sum is ${sum}!”
2、編寫腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和
#!/bin/bash
number1=`grep -c “^$” $1`
number2=`grep -c “^$” $2`
sum=$[number1+number2]
echo “the sumspace is ${sum}!”
3、編寫腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件
sumfile=`tree -L 1 $1|wc -l`
echo “the $1 sumfile is ${sumfile}!”
shift
sumfile1=`tree -L 1 $1|wc -l`
echo “the $1 sumfile is ${sumfile1}!”
shift
sumfile2=`tree -L 1 $1|wc -l`
echo “the $1 sumfile is ${sumfile2}!”

條件測試
判斷某需求是否滿足,需要由測試機制來實現
專用的測試表達式需要由測試命令輔助完成測試過程
評估布爾聲明,以便用在條件性執行中
若真,則返回0
若假,則返回1
測試命令格式:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
注意:EXPRESSION前后必須有空白字符
字符串運算
判斷字符串長度
-z STRING(為空返回為真)
例如:str1=xxx;[ -z $str1 ];echo $?=1
str1=;[ -z $str1 ];echo $?=0
-n STRING(不為空返回為零,-n可忽略不寫)
例如:str1=xyz;[ $str1 ];echo $?=0
str1=;[ $str1 ];echo $?=1
判斷字符串相等
STRING1 = STRING2(字符串相等,相等返回為真)
例如:
str1=aaa;str2=bbb;[ $str1 = $str2 ];echo $?=1
str1=aaa;str2=aaa;[ $str1 = $str2 ];echo $?=0
STRING1 != STRING2(字符串不等,不等返回為真)
例如:
str1=aaa;str2=bbb;[ $str1 = $str2 ];echo $?=0
str1=aaa;str2=aaa;[ $str1 = $str2 ];echo $?=1
字符判斷練習:
x=haha;y=xixi;[ $x = $y ] && echo equal || echo no equal
判斷字符串是否相等,相等打印equal,不相等打印no equal,此處不相等
m=10;n=20;[ $m -eq $n ] && echo equal || echo no equal
判斷數字是否相等,相等打印equal,不相等打印no equal,此處不相等
test還可以進行數字比較,常用的選項是-eq(相等), -ne(不等),-lt(小于), -le(小于等于), -gt(大于), -ge(大于等于)

test文件判斷
-a FILE True if file exists.(文件是否存在)
-b FILE True if file is block special.(是塊文件)
-c FILE True if file is character special.(是字符文件)
-d FILE True if file is a directory.(是目錄)(如果判斷的是目錄的鏈接文件,判斷的是連接到的目錄,而非連接文件本身,例如[ -d /bin/ ])
-e FILE True if file exists.(是否存在)
-f FILE True if file exists and is a regular file.(存在且是普通文件)
-h FILE True if file is a symbolic link.(測試文件是否為符號連接文件)
-p FILE True if file is a named pipe.(是否為管道文件)
-r FILE True if file is readable by you.(是否可讀,測試執行者的權限)
-s FILE True if file exists and is not empty.(是否存在且不空)
-w FILE True if the file is writable by you.(看的是實際權限,而非ls -l顯示的權限,執行者的權限)
-x FILE True if the file is executable by you.(是否可執行,執行者的權限)
練習
1、創建賬戶并給與密碼,當用戶存在時,退出并顯示此目錄已存在,不存在時創建用戶,并給與初始密碼
#!/bin/bash
id $1 &>/dev/null
[ $? -eq 0 ] && echo “the user is exist” && exit
[ $? -ne 0 ] && useradd $1 && echo “magedu”|passwd –stdin $1
echo “$1 user is created”
2、編寫腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數
#!/bin/bash
[ $# -lt 1 ] && echo “you must be input 1 arg” && exit
[ $# -ge 1 ] && echo “the file space line is `grep -c “^$” $1`”
3、編寫腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
#!/bin/bash
ping -c1 $1 > /dev/null && echo “the ip can access” || echo “the ip not to access”
4、編寫腳本/root/bin/checkdisk.sh,檢查磁盤分區空間和inode使用率,如果超過80%,就發廣播警告空間將滿
#!/bin/bash
a=”`df|grep “sd”|tr -s ” ” “%”|cut -d “%” -f5|sort -nr|head -n1`”
[ $a -ge 80 ] && echo “The disk will be full”
5、編寫腳本/bin/per.sh,判斷當前用戶對指定參數文件,是否不可讀并且不可寫
#!/bin/bash
[ -r $1 -a -w $1 ] && echo “the user can read and write” || echo “the user not read and write”
6、編寫腳本/root/bin/excute.sh ,判斷參數文件是否為sh后綴的普通文件,如果是,添加所有人可執行權限,否則提示用戶非腳本文件
#!/bin/bash
[ -f $1 ] && [[ $1 =~ .+\.sh$ ]] && chmod +x $1 || echo “the file is not script”
7、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統
#!/bin/bash
[ -a /etc/noloin ] && echo “the file is exist” || touch /etc/nologin
[ -a /etc/nologin ] && rm -f /etc/nologin || echo “you can access”

使用read命令來接受輸入
read本身的命令是用來給變量賦值
使用read來把輸入值分配給一個或多個shell變量
-p 指定要顯示的提示 read -p “please input your name: ” name;echo “your name is $name”
-s 靜默輸入,一般用于密碼 read -s -p “please input your name: ” passwd (可以隱藏)
-n N 指定輸入的字符長度N
-d ‘字符’ 輸入結束符
-t N TIMEOUT為N秒
read 從標準輸入中讀取值,給每個單詞分配一個變量
所有剩余單詞都被分配給最后一個變量
read -p “Enter a filename: “ FILE

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96092

(0)
七殺七殺
上一篇 2018-04-15
下一篇 2018-04-15

相關推薦

  • Linux上的文件管理類命令

    常用的文件目錄管理命令:cd,pwd,ls,mkdir,rmdir,tree,more,less,head,tail,cp,mv,rm。 cd命令:改變目錄 后面加絕對或者相對路徑 命令格式:cd [options] [Dirname] [Azuth@azuth ~]$ cd /home/Azuth[Azuth@azuth ~]$ pwd/home/Azut…

    Linux筆記 2018-05-20
  • Linux獲取命令幫助信息

    獲取命令的使用幫助 ? ? ?一. 內部命令:help COMMAND ? ? ?二.外部命令: ? ? 1.命令自帶簡要格式的使用幫助 ? ? ? ?# COMMAND –help ? ? 2.使用手冊:manual ? ?位置:/user/share/man ? ? ? ?1.語法:# man [option] COMMAND ? ? ? ?…

    Linux筆記 2018-05-12
  • linux系統命令行安裝軟件

    一、CentOS7 1)首先通過df或lsblk命令,查看系統中有無掛載本地光盤鏡像: 2)若沒有掛載,即當前系統中df看不到光盤設備/dev/sr0,使用mount命令進行光盤掛載: monut /dev/cdrom /mnt 3)然后切換到/mnt路徑下,到Packages目錄下,就可以看到當前系統光盤鏡像所自帶的所有rpm軟件包,然后同通過rpm -i…

    2018-03-30
  • ansible的簡介和用法

    Ansible  (底層是基于ssh連接的,每次操作其他主機需要輸入密碼 ,所以首先要實現基于key的公鑰驗證) 使用ansible: ansible "192.168.60.3" -m shell -a 'ls /root' -k (單個用戶在實現基于key的驗證前) 安裝ansible: yum包的安裝:…

    2018-05-28
  • Linux安全和加解密(三)

    本文主要介紹:1、ssh服務 2、基于SSH的客戶端相關工具 3、SSH端口轉發 4、dropbear編譯安裝 5、AIDE 6、sudo

    2018-05-30
欧美性久久久久