位置變量&特殊變量總結

位置變量

  • 常用的位置變量有 $1, $2, $3 ……,表示命令行傳給腳本的第一個參數,第二個參數,第三個參數。。。

  • $0 表示腳本的文件名,比如a.sh

  • 位置變量在腳本中的主要作用,是讓腳本通過他們來獲取命令行傳遞給腳本的參數。

變量位置調整

shift [n] 
用于調整變量位置

第n+1個位置變量會被重新命名為$1,第$#個位置變量的變量名被重置為\${#-n+1}。n必須是非負數,且不能夠大于\$# ,n默認為1,如果n大于\$#,位置變量不變。當n大于\$#時,返回狀態會大于0(即命令執行錯誤),否則,當n小魚\$#時,返回狀態為0(即執行命令正確)

[root@centos7 bin]#cat testshift.sh #!/bin/bashfor i in 1 2 3 4 5doshift 1echo $1# 總是輸出\$1這個變量sleep 4done

具體執行流程如下:

1471177592472046.jpg

特殊變量

  • 常用特殊變量有:$#,$*,$@,$?

  • $# 腳本參數的個數

  • $* 所有的腳本參數

  • $@ 所有腳本參數

  • $? 上一個命令(不是上一個腳本)執行結果,0表示正確(執行順利完成),其他非0數字,代表錯誤碼

 [root@centos7 bin]#cat testshift.sh 
 #!/bin/bash
 uname -r > /dev/null
 echo $?
 uame -r > /dev/null
 echo $? 
 
 [root@centos7 bin]#bash testshift.sh
  0
  testshift.sh: line 6: uame: command not found
  127
 #在腳本內,執行不同的命令,同樣可以直接返回$?,所以是對命令執行結果的狀態的返回。
[root@centos7 bin]#touch testshift.sh
[root@centos7 bin]#[ ! -f testshift.sh ]
[root@centos7 bin]#echo $?1
  • $$ 當前shell進程的pid

  • $! 后臺運行的最后一個進程的pid

  • $– 顯示shell使用的當前選項

  • $_ 之前命令的最后一個參數

$*與$@的區別

  • $*會將所有的參數,用‘’ 引起來,形成一個字符串

  • $@仍然是多個字符串

練習題:

1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。

[root@centos7 ~/bin#]cat systeminfo.sh 
#!/bin/bash
#
echo -e  "The following is systeminfo:\n"
echo "The hostname is `hostname`"
echo "The IP is `ifconfig |sed -n '2p' |sed -n -r 's@.*inet.(.*) net.*@\1@p'`"
echo "The OS version is `cat /etc/redhat-release`"
echo "The kernel version is `uname -r`"
echo "The CPU is `cat /proc/cpuinfo |grep 'model name' |sed -n '1p' |cut -d: -f2 |tr -d ' 'i`"
echo "The memory size is `cat /proc/meminfo |sed -n '1p' |cut -d: -f2 |tr -d ' '`"
echo "The disk size is `fdisk -l |sed -n '2p' |cut -d: -f2 |cut -d, -f1`"
[root@centos7 ~/bin#]

2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中

[root@centos7 ~/bin#]cat baskup.sh 
#!/bin/bash
#
cp -r /etc/ /root/etc`date +%F`
[root@centos7 ~/bin#]

3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值

[root@centos7 ~/bin#]cat checkdisk.sh 
#!/bin/bash
#
NumDisk=`df |grep 'sd' |tr -s ' ' |cut -d' ' -f5 |cut -d% -f1`
[[ $NumDisk -gt 50 ]] && wall disk will be full!;exit

4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序

[root@centos7 ~/bin#]cat links.sh 
#!/bin/bash
#
echo -e "遠程主機的IP地址及連接數:\n"netstat -nt | tr -s ' ' |cut -d' ' -f5 |tail -n +3 |cut -d: -f1 |sort |uniq -c

5、寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和

[root@centos7 ~/bin#]cat sumid.sh 
#!/bin/bash
#
num1=`cat /etc/passwd |sed -n -e '10p' |cut -d: -f3`
num2=`cat /etc/passwd |sed -n -e '20p' |cut -d: -f3`
let var=$num1+$num2echo "第十個用戶與第二十個用戶的UID之和為:"echo $var

6、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和

[root@centos7 ~/bin#]cat sumspace.sh 
#!/bin/bash
#
fSpace1=`grep '^$' $1 |wc -l`
fSpace2=`grep '^$' $2 |wc -l`
sumSpace=$[ $fSpace1+$fSpace2 ]echo "兩個文件的空白行之和為:$sumSpace"

7、寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件

[root@centos7 ~/bin#]cat sumfile.sh 
#!/bin/bash 
#
#統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件
Detc=`tree -L 1 /etc/ |wc -l`
Fetc=`ls -lR /etc/ |wc -l`

Dvar=`tree -L 1 /var/ |wc -l`
Fvar=`ls -lR /var/ |wc -l`

Dusr=`tree -L 1 /usr/ |wc -l`
Fusr=`ls -lR /usr/ |wc -l`
echo "/etc目錄中共有一級子目錄$Detc 個,文件 $Fetc 個"
echo "/var目錄中共有一級子目錄$Dvar 個,文件 $Fvar 個"
echo "/usr目錄中共有一級子目錄$Dusr 個,文件 $Fusr 個"

8、寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數

[root@centos7 ~/bin#]cat argsnum.sh 
#!/bin/bash
#
[[ $# -lt 1 ]] && echo "至少應該給一個參數"
[[ $# -ge 1 ]] && grep '^$' $1 |wc -l 
[root@centos7 ~/bin#]

9、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”

[root@centos7 ~/bin#]cat hostping.sh 
#!/bin/bash
#
[[ $# -eq 1 ]] && (echo "$1" |grep -q -E '\<((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\>' && (
ping -c1 -W1 $1 &> /dev/null && echo "該IP地址可訪問!" || echo \ "該IP地址不可訪問!" )) || echo "請給出一個合法IP地址!"; exit 2[root@centos7 ~/bin#]

10、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫

[root@centos7 ~/bin#]cat per.sh 
#!/bin/bash
[ ! -r $1 ] && [ ! -w $1 ] && echo "當前用戶對$1 文件不可讀且不可寫!"

11、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。

[root@centos7 ~/bin#]cat nologin.sh 
#!/bin/bash
#
[ -e /etc/nologin ] && echo "已禁用普通用戶登錄系統" || touch /etc/nologin && echo "已禁用普通用戶登錄系統"
[root@centos7 ~/bin#]

[root@centos7 ~/bin#]cat login.sh 
#!/bin/bash
#
[ -e /etc/nologin ] && rm -f /etc/nologin && echo "已允許普通用戶登錄系統!"

12、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”

#!/bin/bash
[[ $# != 1 ]] && ( echo "請輸入一個IP地址 " ; exit 1) 
[[ $1 =~ [[:digit:]].[[:digit:]].[[:digit:]].[[:digit:]] ]] || ( echo "您輸入的IP地址不合法" ; exit 1 )
ping -w 1 -c 1 $1 &> /dev/null && echo "IP地址$1可以訪問" || echo "IP地址$1不可訪問 "
exit 0

13、計算1+2+3+…+100的值

seq -s '+' 1 100| bc

14、計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之

#!/bin/bas
#計算A和B及其之間數字的總和,如果A>B則退出
[[ $1 -ge $2 ]] && echo "第一個數字應小于第二個數字" && exit 
lvar=$1
hvar=$2
echo -n "the sumnum from $lvar to $hvar is : "
seq -s '+' $lvar $hvar | bc

原創文章,作者:m20-吳清玲,如若轉載,請注明出處:http://www.www58058.com/35609

(0)
m20-吳清玲m20-吳清玲
上一篇 2016-08-15 09:22
下一篇 2016-08-15 09:24

相關推薦

  • OpenStack私有云部署

    前言 相信你一定對“云主機”一詞并不陌生吧,通過在Web頁面選擇所需主機配置,即可快速定制一臺屬于自己的虛擬主機,并實現登陸操作,大大節省了物理資源。但這一過程是如何實現的呢?本文帶來OpenStack Icehouse私有云實戰部署。 OpenStack 簡介 OpenStack是由網絡主機服務商Rackspace和美國宇航局聯合推出的一個開源項目,Ope…

    2016-12-19
  • 第六周作業

    vim文本編輯器基本用法     基本模式:         編輯模式,命令模式    輸入模式        末行模式:    …

    Linux干貨 2016-09-19
  • 實驗:路由、bonding、team

    實驗:路由實驗 路由表構成目標網絡:網絡ID 子網掩碼接口:到達目標網絡,從哪個接口出來,此接口網關:gateway,下一個鄰近路由器的鄰近接口的IP地址,如果目標網絡和本路由器直接,網關的地址為接口的IP centos6 關閉NetworkManager服務chkconfig NetworkManagerservice NetworkManager sto…

    Linux干貨 2017-05-06
  • Redis 3.0.0正式版發布,全新的分布式高可用數據庫

    Redis 3.0.0 正式版終于到來了!最重要的新特性是集群(Redis Cluster),提供Redis功能子集(比如不支持多數據庫)的分布式、容錯的實現(最多支持1000結點)。   Salvatore 'antirez' Sanfilippo在Google Groups里表示,這是Redis的重要時刻?!拔蚁嘈沤裉斓腞edis 3.0…

    Linux干貨 2015-04-03
  • iptables基礎實戰練習

    (1) 放行ssh (端口:22) 1 iptables -A INPUT -d 192.168.42.153 -p tcp –dport 22 -j ACCEPT 2 iptables -A OUTPUT -s 192.168.42.153 -p tcp –sport 22 -j ACCEPT (2)修改默認規則鏈(關閉所有端口) 1 iptables…

    2017-09-10
  • 【招聘】天津/贊普科技股份有限公司/Linux系統運維工程師/6-7k/五險一金

    天津贊普科技股份有限公司——簡稱贊普科技,成立于2003年,坐落于天津市濱海高新區,是一家專業的互聯網綜合服務商,主營數字網絡建設、數據接入及增值服務和智能化網絡產品及服務。歷經11年的發展,贊普科技已成長為高新區科技型小巨人企業、國家高新技術企業,專注于移動互聯與大數據、云計算、商業WIFI行業的領軍者。     贊普科技計劃…

    Linux干貨 2015-12-03

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-15 17:23

    總結的很好,通過實驗驗證了自己的想法,加深了自己對變量的理解。

欧美性久久久久