Linux Shell脚本编程基础(11)
實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令并且把它們送到內核,不僅如此,Shell有自己的編程語言用于對命令的編輯,它允許用戶編寫由shell命令組成的程序.Shel編程語言具有普通編程語言的很多特點,比如它也有循環結構和分支控制結構等,用這種編程語言編寫的Shell程序與其他應用程序具有同樣的效果,下面我們會介紹Shell-Script的編寫.
Echo 標準輸出
echo命令用于在shell中打印shell變量的值,或者直接輸出指定的字符串,linux的echo命令,在shell編程中極為常用,在終端下打印變量value的時候也是常常用到的,因此有必要了解下echo的用法echo命令的功能是在顯示器上顯示一段文字,一般起到一個提示的作用.
[root@localhost ~]# echo --help語法格式:[ echo [選項] [輸出內容] ]-e #支持反斜線控制的字符轉換-n #取消輸出后行尾的換行符號 ----------------------------------------------------------------------------------------- 控制字符:\\ #輸出\本身\a #輸出警告音 \b #退格鍵,也就是向左刪除鍵 \c #取消輸出行末的換行符,和"-n"選項一致 \e #ESCAPE鍵 \f #換頁符 \n #換行符 \r #回車鍵 \t #制表符,也就是Tab鍵 \v #垂直制表符 \0nnn #按照八進制ASCII碼輸出字符,其中0為數字零,nnn是三位八進制數\xhh #按照十六進制ASCII碼表輸出字符,其中hh是兩位十六進制數 ----------------------------------------------------------------------------------------- 特殊格式:\\ #輸出\本身"\e[1" #代表顏色輸入開始"\e[0m" #代表顏色輸入結束\e[0m #關閉所有屬性\e[1m #設置高亮度\e[4m #下劃線 \e[5m #閃爍\e[7m #反顯 \e[8m #消隱\e[nA #光標上移n行 \e[nB #光標下移n行 \e[nC #光標右移n行 \e[nD #光標左移n行 \e[y;xH #設置光標位置 \e[2J #清屏 \e[K #清除從光標到行尾的內容 \e[s #保存光標位置 \e[u #恢復光標位置 \e[25l #隱藏光標 \e[25h #顯示光標 ----------------------------------------------------------------------------------------- 文字顏色和底紋顏色:文字顏色代碼:30=黑色,31=紅色,32=綠色,33=黃色,34=藍色,35=洋紅,36=青色,37=白色,39=結束 底紋顏色代碼:40=黑色,41=紅色,42=綠色,43=黃色,44=藍色,45=洋紅,46=青色,47=白色,49=結束 -----------------------------------------------------------------------------------------實例1: 輸出一個紅字,并且黃底的"hello world"
[root@localhost ~]# echo -e "\e[31;43m hello world \e[0m"hello world實例2: 輸出\a本身
[root@localhost ~]# echo -e "\\\a"\aRead 標準輸入
read命令從鍵盤讀取變量的值,通常用在shell腳本中與用戶進行交互的場合,該命令可以一次讀取多個變量的值,變量和輸入的值都需要使用空格隔開.在read命令后面,如果沒有指定變量名,讀取的數據將被自動賦值給特定的變量REPLY.
[root@localhost ~]# read --help語法格式:[ read [選項] [輸出內容] ]-p #"提示信息",指定讀取值時的提示符-t #指定讀取值時等待的時間(秒),read等待的秒數-n #指定最多能接收的字符數(達到即執行)-s #隱藏輸入信息實例1: 通過Read命令讀取一個值
[root@localhost ~]# read temp hello Lyshark[root@localhost ~]# echo $temp hello Lyshark實例2: 通過read命令讀取,并輸出一段提示信息,且10秒等待輸入時間
[root@localhost ~]# read -p "please input name" -t 10 temp wangrui[root@localhost ~]# echo $temp wangrui小腳本:
#!/bin/bashread -p "請輸入你的名字:" name echo $nameread -t 30 -p "請在30秒內完成輸入,輸入你的年齡:" age echo $ageread -s -t 30 "隱藏輸入您的性別(m/w):" sex echo $sexBash 變量
變量是計算機語言中能儲存計算結果或能表示值抽象概念,變量可以通過變量名訪問,在指令式語言中,變量通常是可變的.
變量是 bash 環境中非常重要的一個東西,我們知道 Linux 是多人多任務的環境,每個人登陸系統都能取得一個 bash 每個人都能夠使用 bash 下達 mail 這個命令來收受『自己』的郵件,問題是 bash 是如何得知你的郵件信箱是哪個文件?這就需要『變量』的幫助啦,所以你說變量重不重要呢? 下面我們將介紹重要的環境變量、變量的取用與配置等數據。
關于變量名定義
● 變量名可以自定義,如果不指定變量名,會把輸入保存入默認變量REPLY.
● 如果只提供了一個變量名,則整個輸入行賦予該變量.
● 如果提供了一個以上的變量名,則輸入行分為若干字,一個接一個地賦予各個變量,而命令行上的最后一個變量取得剩余的所有值.
◆變量定義的規范◆
規范1: 變量名稱可以由字母、數字和下劃線組成,但是不能以數字開頭,變量中間不能有空格
[root@localhost ~]# name=lyshark [root@localhost ~]# echo $name lyshark[root@localhost ~]# 1name=lyshark -bash: 1name=lyshark: command not found規范2: 在bash中變量的默認類型都是字符串型,如果要進行數值運算,則必修指定變量類型為數值型
[root@localhost ~]# x=10 [root@localhost ~]# y=20 [root@localhost ~]# sum=$x+$y[root@localhost ~]# echo $sum 10+20規范3: 變量用等號連接值,等號左右兩側不能有空格
[root@localhost ~]# name=lyshark [root@localhost ~]# echo $name lyshark[root@localhost ~]# name =lyshark -bash: name: command not found[root@localhost ~]# name= lyshark -bash: lyshark: command not found規范4: 變量的值如果有空格,需要使用單引號或雙引號包括
1.雙引號:下面輸出一段 "hello world"
[root@localhost ~]# temp="hello world"[root@localhost ~]# echo $temp hello world2.\脫意字符:輸出$name本身
[root@localhost ~]# name=lyshark[root@localhost ~]# echo "$name" lyshark[root@localhost ~]# echo "\$name" $name3.反引號與雙引號:輸出結果相同
[root@localhost ~]# echo `date` Sun Sep 23 23:51:38 EDT 2018[root@localhost ~]# echo "`date`" Sun Sep 23 23:51:45 EDT 2018[root@localhost ~]# echo "$(date)" Sun Sep 23 23:51:52 EDT 2018[root@localhost ~]# echo "\$(date)" $(date)4.單引號括起來的都是普通字符
[root@localhost ~]# echo '`date`' `date` [root@localhost ~]# echo '$name' $name規范5: 變量疊加:如果需要增加變量的值,那么可以進行變量值的疊加
1.變量需要用雙引號包含 "$變量名" 或用 ${變量名} 包含變量名,才可以實現疊加.
[root@localhost ~]# name=lyshark [root@localhost ~]# echo $name lyshark[root@localhost ~]# temp="$name is" [root@localhost ~]# echo $temp lyshark is[root@localhost ~]# end="${temp} hack" [root@localhost ~]# echo $end lyshark is hack2.將命令結果賦值給一個變量,則需要使用反引號或$()包含命令.
[root@localhost ~]# ntp=`date` [root@localhost ~]# echo $ntp Mon Sep 24 00:01:50 EDT 2018[root@localhost ~]# temp=$(pwd) [root@localhost ~]# echo $temp /root◆用戶自定義變量◆
用戶自定義變量是最常見的變量,由用戶自由定義變量名和變量的值.
顯示變量:set 顯示系統中所有的變量(自定義變量,與系統變量等)
[root@localhost ~]# set BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote... BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() ....變量調用:使用 $調用變量
[root@localhost ~]# name=lyshark[root@localhost ~]# echo $name ....省略....變量刪除:刪除一個正在使用的變量
[root@localhost ~]# name=lyshark [root@localhost ~]# echo $name lyshark[root@localhost ~]# unset name [root@localhost ~]# echo $nameset -u:當執行時使用到未定義過的變量,則顯示錯誤信息
[root@localhost ~]# echo $age[root@localhost ~]# set -u[root@localhost ~]# echo $age -bash: age: unbound variableset -x:調用命令執行前,會先把命令輸出一次
[root@localhost ~]# set -x[root@localhost ~]# ls -l / + ls --color=auto -l / total 16 lrwxrwxrwx. 1 root root 7 Sep 18 09:05 bin -> usr/bin dr-xr-xr-x. 5 root root 4096 Sep 18 09:12 boot ....省略....◆系統的環境變量◆
環境變量可以幫我們達到很多功能,包括家目錄的變換、提示字符的顯示、運行文件搜尋的路徑等,那么既然環境變量有那么多的功能,我們可以利用兩個命令來查閱分別是 env 與 export ,這種變量中主要保存的是和系統操作環境相關的數據,比如當前登錄用戶,用戶的家目錄,命令的提示符等.環境變量的變量名可以自由定義,但是一般對系統起作用的環境變量的變量名是系統預先設定好的.
[環境變量]:環境變量的設置
[root@localhost ~]# export AGE=22 [root@localhost ~]# echo $AGE 22?環境變量的查詢與刪除
解釋:env和set的區別:set命令可以查看所有變量,而env命令只能查看環境變量。
[env變量]:實現所有環境變量查詢
解釋:env命令可以查詢到所有的環境變量,可是還有一些變量雖然不是環境變量,卻是和Bash操作接口相關的變量,這些變量也對我們的Bash操作終端起到了重要的作用。這些變量就只能用set命令來查看了。
[PATH變量]:系統查找命令的路徑
解釋:PATH變量的值是用“:”分割的路徑,這些路徑就是系統查找命令的路徑。也就是說當我們輸入了一個程序名,如果沒有寫入路徑,系統就會到PATH變量定義的路徑中去尋找,是否有可以執行的程序。如果找到則執行,否則會報“命令沒有發現”的錯誤。
[PS1變量]:命令提示符設置
解釋:PS1是用來定義命令行的提示符的,可以安裝我們自己的需求來定義自己 喜歡的提示符。PS1可以支持以下這些選項:
想要使用這些必須先知道定義的規范,來看下官方的PS1
[root@localhost ~]# echo $PS1[\u@\h \W]\$定義ps1的值時需要注意單引號,否則不生效
[root@localhost ~]# PS1='[\u@\t \w]$' [root@00:49:09 ~]$ [root@00:49:10 ~]$ PS1='[\u@\h \W]\$' [root@localhost ~]#LANG 語系變量
LANG定義的是Linux 的主語系環境變量:
[root@localhost ~]#echo $LANG en_US.UTF-8這是因為我們Linux安裝時,選擇的是英文安裝,所以默認的主語系變量是“en_US.UTF-8”。那么Linux中到底支持多少語系呢?我們可以使用以下命令查詢:
[root@localhost ~]#locale -a |more aa_DJ aa_DJ.iso88591 aa_DJ.utf8 aa_ER aa_ER@saaho aa_ER.utf8 aa_ER.utf8@saaho aa_ET aa_ET.utf8 ....省略....[root@localhost ~]#locale -a |wc -l 789我們當前是什么語系可以用locale 直接查詢:
[root@localhost ~]#locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" ....省略....這是當前系統語系,又是默認語系,有沒有快暈倒的感覺。解釋下吧,我們可以這樣理解,默認語系是下次重啟之后系統所使用的語系,而當前系統語系是當前系統使用的語系。如果系統重啟,會從默認語系配置文件/etc/sysconfig/i18n中讀出語系,然后賦予變量LANG讓這個語系生效。也就是說,LANG定義的語系只對當前系統生效,要想永久生效就要修改/etc/sysconfig/i18n文件了。
說到這里,我們需要解釋下Linux中文支持的問題。是不是我們只要定義了語系為中文語系,如zh_CN.UTF-8就可以正確顯示中文了呢?這要分情況,如果我們是在圖形界面中,或者是使用遠程連接工具(如SecureCRT),只要正確設置了語系,那么是可以正確顯示中文的。當然遠程連接工具也要配置正確的語系環境,具體配置方式可以參考Linux系統安裝章節。
那么如果是純字符界面(本地終端tty1-tty6)是不能顯示中文的,因為Linux的純字符界面時不能顯示中文這么復雜的編碼的。如果我們非要在純字符界面顯示中文,那么只能安裝中文插件,如zhcon等。
◆位置參數變量◆
解釋:這種變量主要是用來向腳本當中傳遞參數或數據的,變量名不能自定義,變量作用是固定的.
| $n | n代表數字,$0代表命令本身,$1-$9代表第一到第九個參數,十以上參數需要用大括號包含,如:${10}. |
| $* | 這個變量代表命令行中的所有參數,$*把所有參數看成一個整體. |
| $@ | 這個變量也代表命令行中所有參數,不過$@把每個參數區分對待. |
| $# | 這個變量代表命令行中所有參數的個數. |
◆系統預定義變量◆
解釋:預定義變量是Bash中已經定義好的變量,變量名不能自定義,變量作用也是固定的.
| $? | 最后一次執行命令的返回狀態,正確返回0,錯誤返回非0 |
| $$ | 當前進程的進程號(PID) |
| $! | 后臺運行的最后一個進程的進程號(PID) |
實例1: $? 判斷上一條命令執行狀態,成功返回0,失敗返回非0
[root@localhost ~]# ls -l total 12 -rw-r--r-- 1 root root 112 Sep 24 01:25 a.sh -rw-r--r-- 1 root root 30 Sep 24 01:26 b.sh -rw-r--r-- 1 root root 165 Sep 24 01:29 c.sh[root@localhost ~]# echo $? ←上條執行成功返0 0[root@localhost ~]# lss -bash: lss: command not found[root@localhost ~]# echo $? ←上條執行失敗返非0 127實例2: $$ 返回自身進程號
[root@localhost ~]# cat d.sh #!/bin/bashecho "本腳本的進程號是: $$"[root@localhost ~]# bash d.sh 本腳本的進程號是: 1540實例3: $! 返回最后一個后臺執行的命令進程ID號
[root@localhost ~]# cat e.sh #!/bin/bashfind / -name "*.log" &echo "最后一個后臺執行的命令進程是: $!"[root@localhost ~]# bash e.sh 最后一個后臺執行的命令進程是: 1546Bash 數值與運算符
declare命令用于聲明和顯示已存在的shell變量,當不提供變量名參數時顯示所有shell變量,declare命令若不帶任何參數選項,則會顯示所有shell變量及其值,declare的功能與typeset命令的功能是相同的.
[root@localhost ~]# declare --help[語法格式]: declare [選項] [變量名]- #給變量設定類型+ #取消變量的類型-a #將變量聲明成數組-i #將變量聲明成整數型-r #將變量聲明成只讀-x #將變量聲明成環境變量-p #顯示指定變量的類型及內容聲明整數型: 聲明整數型并使用
[root@localhost ~]# declare -i temp #此處我們聲明了temp變量為整數型[root@localhost ~]# temp=100 #賦值整形數據可打印 [root@localhost ~]# echo $temp 100[root@localhost ~]# temp=a #賦值一個字符打印自動歸0 [root@localhost ~]# echo $temp 0[root@localhost ~]# unset temp #使用結束,撤銷變量聲明定義數組: 聲明數組并定義元素,打印
[root@localhost ~]# declare -a name #聲明name為數組[root@localhost ~]# name[0]="hello world" #給數組name[0]賦值 [root@localhost ~]# name[1]="hello lyshark" #給數組name[1]賦值[root@localhost ~]# echo $name #默認打印name[0],因為下標從0開始 hello world[root@localhost ~]# name[2]="hello myblog" #給數組name[2]賦值[root@localhost ~]# echo "${name[*]}" #打印數組全部元素hello world hello lyshark hello myblog[root@localhost ~]# echo ${#name[*]} #統計數組元素個數 3 [root@localhost ~]# echo ${#name[@]} #統計數組元素個數 3[root@localhost ~]# declare -p name #打印數組元素declare -a name='([0]="hello world" [1]="hello lyshark" [2]="hello myblog")'[root@localhost ~]# unset name #使用結束,撤銷數組聲明定義數組: 聲明數組,并在聲明時定義元素內容
[root@localhost ~]# declare -a num=(1 2 3 4 5) #聲明num為數組,并在聲明是賦值[root@localhost ~]# echo ${#num[*]} #正確,一共有5個元素 5[root@localhost ~]# declare -p num #分別打印數組中的元素declare -a num='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")' [root@localhost ~]# unset num #使用結束,撤銷數組定義初始化數組: 數組定義的多種方法(定義并初始化)
---------------------------------------------------------------------------------------------------- [方法1] [root@localhost ~]# declare -a array_name=(Jerry Alice David LyShark) #通過命令行一部到位 [root@localhost ~]# declare -p array_name #打印查看結果 declare -a array_name='([0]="Jerry" [1]="Alice" [2]="David" [3]="LyShark")' ---------------------------------------------------------------------------------------------------- [方法2] [root@localhost ~]# declare -a array_name #先聲明array_name數組 [root@localhost ~]# array_name=(Jerry Alice David LyShark) #緊接著打印 [root@localhost ~]# declare -p array_name declare -a array_name='([0]="Jerry" [1]="Alice" [2]="David" [3]="LyShark")' ---------------------------------------------------------------------------------------------------- [方法3] [root@localhost ~]# string="Jerry Alice Daid LyShark" #聲明一個字符串 [root@localhost ~]# array_name=($string) #直接轉換成數組 [root@localhost ~]# declare -p array_name declare -a array_name='([0]="Jerry" [1]="Alice" [2]="Daid" [3]="LyShark")' ---------------------------------------------------------------------------------------------------- [方法4] [root@localhost ~]# declare -a array_name #聲明一個字符串 [root@localhost ~]# array_name=([0]="LyShark" [1]="Daid" [2]="Alice" [3]="Jerry") #直接轉換成數組[root@localhost ~]# echo ${array_name[@]} #查詢數組元素 LyShark Daid Alice Jerry[root@localhost ~]# declare -p array_name #命令行查詢 declare -a array_name='([0]="LyShark" [1]="Daid" [2]="Alice" [3]="Jerry")'[root@localhost ~]# unset array_name #使用結束,撤銷數組 ----------------------------------------------------------------------------------------------------求數組長度: 求數組長度,和單個數組元素長度.
[root@localhost ~]# declare -a array_name=(Jerry Alice David LyShark) #聲明測試數組 [root@localhost ~]# echo ${array_name[*]} #打印全部數組元素 Jerry Alice David LyShark[root@localhost ~]# echo ${#array_name[*]} #顯示全部數組數 4 [root@localhost ~]# echo ${#array_name[@]} #顯示全部數組數 4[root@localhost ~]# echo ${#array_name[0]} #顯示name[0]字符個數 5 [root@localhost ~]# echo ${#array_name[3]} #顯示name[3]字符個數 7[root@localhost ~]# unset array_name #使用結束,撤銷數組聲明實現算數: 通過聲明實現,整數計算
[root@localhost ~]# x=10 [root@localhost ~]# y=20 [root@localhost ~]# [root@localhost ~]# declare -i temp=$x+$y [root@localhost ~]# [root@localhost ~]# echo $temp 30聲明環境變量: 通過declare聲明環境變量,和export是同樣的效果
[root@localhost ~]# declare -x NAMES="LyShark" [root@localhost ~]# env |grep NAMES NAMES=LyShark[root@localhost ~]# unset NAMES設置只讀變量: 設置只讀變量,只能讀取變量,無法改變其數值
[root@localhost ~]# declare -r test="hello world" [root@localhost ~]# echo $test hello world[root@localhost ~]# test=1234 #這里由于設置了只讀屬性,所以無法修改 -bash: test: readonly variableexpr 或 let 數值運算
expr命令是一款表達式計算工具,使用它完成表達式的求值操作.let命令是bash中用于計算的工具,提供常用運算符還提供了方冪運算符,在變量的房屋計算中不需要加上$來表示變量,如果表達式的值是非0,那么返回的狀態值是0.否則,返回的狀態值是1.
expr加法乘法運算: 使用expr完成一次加法和乘法運算,(需要注意的是,運算符兩邊必須要有空格,否則不會運算)
[root@localhost ~]# declare -i x=10 [root@localhost ~]# declare -i y=20[root@localhost ~]# temp=$(expr $x + $y ) [root@localhost ~]# echo $temp 30[root@localhost ~]# temp=$(expr $x * $y ) [root@localhost ~]# echo $temp 200let加法乘法運算: 使用let完成一次加法與乘法運算,(此處并沒有嚴格規定運算符兩邊的距離)
[root@localhost ~]# declare -i x=100 [root@localhost ~]# declare -i y=200[root@localhost ~]# let temp=$x+$y [root@localhost ~]# echo $temp 300[root@localhost ~]# let temp=$x*$y [root@localhost ~]# echo $temp 20000let ++ --: let實現數值每次遞增或遞減1,類似C語言中的 x++
[root@localhost ~]# declare -i num=1[root@localhost ~]# let num++ [root@localhost ~]# echo $num 2 [root@localhost ~]# let num++ [root@localhost ~]# echo $num 3 [root@localhost ~]# let num-- [root@localhost ~]# echo $num 2[root@localhost ~]# let --num [root@localhost ~]# echo $num 1let x+=y: let數值每次遞增或遞減x,類似C語言中的 x+=y
[root@localhost ~]# declare -i num=1[root@localhost ~]# let num+=1 [root@localhost ~]# echo $num 2 [root@localhost ~]# let num-=1 [root@localhost ~]# echo $num 1[root@localhost ~]# let num+=10 [root@localhost ~]# echo $num 11特殊格式運算: 使用"$((運算式))" 或 "$[運算式]" 格式進行算數運算
[root@localhost ~]# declare -i x=100 [root@localhost ~]# declare -i y=150[root@localhost ~]# temp=$(( $x+$y )) [root@localhost ~]# echo $temp 250[root@localhost ~]# temp=$[ $x*$y ] [root@localhost ~]# echo $temp 15000Shell 運算符優先級
運算符的優先級,就是當有多個運算符同時存在時,誰先進行數值計算,但是有時也是有特殊情況,下面分別解釋一下吧.
按照表格的優先級是乘除優先于加減,但是由于加減被()調用所以,括號的優先級高于乘除.
[root@localhost ~]# declare -i temp[root@localhost ~]# temp=$(( (10+20)*2/4 )) [root@localhost ~]# echo $temp 15取模運算和取余運算絕大部分是重疊的,但是一個是計算機術語,一個是數學概念,區別在于取模運算對負數處理不太一樣.
[root@localhost ~]# declare -i temp [root@localhost ~]# [root@localhost ~]# temp=$(( 14%3 )) [root@localhost ~]# echo $temp 2 [root@localhost ~]# temp=$(( -14%3 )) [root@localhost ~]# echo $temp -2 [root@localhost ~]# temp=$(( -14%-3 )) [root@localhost ~]# echo $temp -2 [root@localhost ~]# temp=$(( 14%-3 )) [root@localhost ~]# echo $temp 2 [root@localhost ~]# unset temp邏輯與,只有兩邊同時為真,才會返回真.
[root@localhost ~]# declare -i temp [root@localhost ~]# [root@localhost ~]# temp=$(( 0 && 1 )) [root@localhost ~]# echo $temp 0 [root@localhost ~]# [root@localhost ~]# temp=$(( 1 && 1 )) [root@localhost ~]# echo $temp 1轉載于:https://www.cnblogs.com/LyShark/p/10221808.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Linux Shell脚本编程基础(11)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 芒果千层多少钱一个?
- 下一篇: 南京的美食有哪些呢?