bash腳本初探


 

 

 

 

 

 

 

 

 

 

 

bash腳本.png 

 

(注)$@和$*的區別,以及$0..$n

[root@ _6_ ~]# cat weizhi.sh 
#!/bin/bash
echo "\$* is :$*"
echo "\$@ is :$@"
echo "\$# is :$#"
echo "打印\$*"
for i in "$*";
 do
  echo "$i"
 done
echo "打印\$@"
for k in "$@";
 do
  echo "$k"
 done
echo "$0 $1 $2 $5 $4 $5"
[root@ _7_ ~]# bash weizhi.sh 1 2 3 4 5
$* is :1 2 3 4 5
$@ is :1 2 3 4 5
$# is :5
打印$*
1 2 3 4 5
打印$@
1
2
3
4
5
weizhi.sh 1 2 3 4 5

$0為腳本名稱,包括路徑
$1..$n為腳本的第n個參數
$#為腳本參數個數
$*和$@是所有的腳本參數
        在被雙引號引起來時:
                $* 所有參數是一個整體
                $@ 每個參數是獨立個體



作業:

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

#!/bin/bash
echo "主機名為:`uname -n`"
echo "ip為:`ip addr|egrep -A2 "^[[:digit:]]+"|sed 'n;d'|sed -n 'n;p'|tr -s ' '|cut -d' ' -f1,3`"
echo "操作系統版本:`cat /etc/redhat-release`"
echo "內核版本號為:`uname -r`"
echo "CPU信息為:`cat /proc/cpuinfo |grep "CPU"|sed -r 's/.*:(.*)/\1/'`"
echo "內存大小為:`cat /proc/meminfo |grep "MemTotal"|sed -r 's/[^0-9]*([0-9].*)$/\1/'`"
echo "硬盤大小為:`fdisk -l|grep "/dev/sd[a-z][::]"`"

[root@ _2_ ~/bin/old_dir]# bash systeminfo.sh 
主機名為:localhost.localdomain
ip為: 127.0.0.1/8
 192.168.33.200/24
 192.168.122.1/24
操作系統版本:CentOS Linux release 7.2.1511 (Core) 
內核版本號為:3.10.0-327.el7.x86_64
CPU信息為: Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
內存大小為:1001332 kB
硬盤大小為:磁盤 /dev/sda:21.5 GB, 21474836480 字節,41943040 個扇區

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

cat /root/bin/backup.sh
#!/bin/bash
tar -zcf /root/etc`date +%F`.tar.gz /etc/

crontab -e 
00 12 * * * /bin/bash /root/backup.sh

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

#!/bin/bash

df -h |grep -v "/dev/sr0" |awk -F' ' '{print $5}'|tail -n +2|sort|tail -1

[root@ _2_ ~/bin/old_dir]# bash /root/bin/disk.sh
31%

 

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

netstat -nt|tail -n +3|awk -F' ' '{print $4}'|sort|uniq -c
[root@ _34_ ~/bin/old_dir]# netstat -nt|tail -n +3|awk -F' ' '{print $4}'|sort|uniq -c
      1 192.168.33.200:22

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

#!/bin/bash
id_user10=`sed -n '10p' | cut -d: -f3`
id_user20=`sed -n '20p' | cut -d: -f3`
sum=$[$id_user20+$id_user10]
echo "第十個用戶和第二十個用戶ID和為:$sum"

[root@ _35_ ~/bin/old_dir]# bash sumid.sh 
第十個用戶和第二十個用戶ID和為:70

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

#!/bin/bash
[ $# -ne 2 ] && echo "Please input two args !" && exit 2
[ ! -f $1 -o ! -f $2 ] && echo "Please input two file!" && exit 3
file1_space=`grep "^$" $1 |wc -l`
file2_space=`grep "^$" $2 |wc -l`
sum_space=$[file1_space+file2_space]
echo "這兩個文件行數為:$sum_space"

[root@ _37_ ~/bin/old_dir]# bash sumspace.sh  /etc/fstab /etc/issue
這兩個文件行數為:2

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

#!/bin/bash
num1=`ls /etc | wc -l`
num2=`ls /var | wc -l`
num3=`ls /usr | wc -l`
sum=$[$num1+$num2+$num3]
echo "所有子文件目錄和為:$sum"

[root@ _38_ ~/bin/old_dir]# bash sumfile.sh 
所有子文件目錄和為:294

附加:
8、如果磁盤使用率超過80%。使用wall報警

#!/bin/bash
max_disk=`df | grep "/dev/sd[a-z]" |  awk -F' ' '{print $5}' | tail -n +2 | sort -n |tail -1|cut -d% -f1`
[ $max_disk -ge 80 ] && wall disk will be full!

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

#!/bin/bash

[ $# -lt 1 ] && echo "至少應該給一個參數" && exit
[ -f $1 ] && echo "$1的空白行數為:`sed -n '/^$/p' $1 | wc -l`" || echo "你給的第一個參數不是文件!"

[root@ _43_ ~/bin/old_dir]# bash argsnum.sh
至少應該給一個參數
[root@ _44_ ~/bin/old_dir]# bash argsnum.sh 1
你給的第一個參數不是文件!
[root@ _45_ ~/bin/old_dir]# bash argsnum.sh /etc/issue
/etc/issue的空白行數為:1

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

#!/bin/bash
echo "$1" | grep -q "\(\(25[0-4]\|2[0-4][0-9]\|1[0-9][0-9]\|[1-9]\?[0-9]\)\.\)\{3\}\(25[0-4]\|2[0-4][0-9]\|1[0-9][0-9]\|[1-9]\?[0-9]\)"
if [ $? -eq 0 ];then
 echo "正在嘗試連接 $1"
 ping -c 2 -w 3 $1 >> /dev/null
 if [ $? -eq 0 ];then
  echo "地址可達!"
 else
  echo "地址不可達!"
 fi
else
 echo "你給的不是一個IPV4地址!"
fi

[root@ _47_ ~/bin/old_dir]# bash hostping.sh
你給的不是一個IPV4地址!
[root@ _48_ ~/bin/old_dir]# bash hostping.sh 10.2.3
你給的不是一個IPV4地址!
[root@ _49_ ~/bin/old_dir]# bash hostping.sh 10.2.255.666
你給的不是一個IPV4地址!
[root@ _50_ ~/bin/old_dir]# bash hostping.sh 10.1.0.1
正在嘗試連接 10.1.0.1
地址可達!
[root@ _51_ ~/bin/old_dir]# bash hostping.sh 10.1.0.2
正在嘗試連接 10.1.0.2
地址不可達!

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

#!/bin/bash
[ ! -w '/tmp/file1' ] && [ ! -r '/tmp/file2' ] && (echo "當前用戶對該文件不可讀且不可寫!" ; exit)
echo "當前用戶對該文件 并非 不可讀且不可寫!"

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

禁止普通用戶登錄
#!/bin/bash
touch /etc/nologin

允許普通用戶登錄
#!/bin/bash
rm -rf /etc/nologin

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

#!/bin/bash
 sum=`echo {1..100} |tr ' ' '+'|bc`
 echo "1+..100的和為:$sum"

[root@ _53_ ~/bin/old_dir]# bash jisuan1-100.sh
1+..100的和為:5050

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

#!/bin/bash
[ ! $# -eq 2 ] && echo "請輸入兩個參數!" && exit
expr $1 + $2 &>/dev/null
[ $? -ne 0 ] && echo "你輸入的參數中有非整數!" && exit
[ ! $2 -gt $1 ] && echo "你輸入的第一個參數不小于第二個參數" && exit
sum=`seq $1 $2|tr '\n' '+'|sed -r 's@(.*)\+@\1\n@' | bc`
echo "兩個參數之間的和為:$sum"

[root@ _55_ ~/bin/old_dir]# bash bijiaoAB.sh 1 0
你輸入的第一個參數不小于第二個參數
[root@ _56_ ~/bin/old_dir]# bash bijiaoAB.sh  0
請輸入兩個參數!
[root@ _57_ ~/bin/old_dir]# bash bijiaoAB.sh 1 9
兩個參數之間的和為:45




原創文章,作者:M20-1--孔祥文,如若轉載,請注明出處:http://www.www58058.com/35212

(0)
M20-1--孔祥文M20-1--孔祥文
上一篇 2016-08-14
下一篇 2016-08-15

相關推薦

  • ?{ 編譯內核;自制linux; }

    編譯內核、自制linux 自制簡單的linux 前提約定 CentOS 6.8 , Kernel-2.6.32-642.el6.x86_64 基于GRUB – 0.97 / 分區與 boot 分區獨立, /boot 分區 100M+ ,/ 根分區看具體需求,此處為 1G Vmware 12.1,新建一個Li…

    Linux干貨 2016-09-15
  • LINUX基礎知識

    計算機的組成及其功能。 現代計算機體系將計算機分為控制器、運算器、存儲器、輸入設備和輸出設備5個部分 *控制器:控制器是整個計算機的中樞神經,其功能是對程序規定的控制信息進行解釋,并根據具體要求進行控制、調度程序、數據、地址,協調計 算機各個部分工作,協調計算機各部分工作及內存、IO設備等的訪問 *運算器:運算器是對數據進行各種算數運算和邏輯運算也就是對數據…

    Linux干貨 2018-02-25
  • yum命令用法及源碼的編譯

     一:yum 何為yum? yum是rpm的前端程序,可解決軟件包相關依賴性,可在多個庫之間定位軟件包,是up2date 的替代工具。 1.命令格式:     yum [options] [command] [package …] 2.yum客戶端配置文件: 公共配置文件:/etc/yum.conf   &…

    Linux干貨 2017-08-19
  • 超文本傳輸安全協議—HTTPS

        超文本傳輸安全協議(英語:Hypertext Transfer Protocol Secure,縮寫:HTTPS,常稱為HTTP over TLS,HTTP over SSL或HTTP Secure)是一種通過計算機網絡進行安全通信的傳輸協議。HTTPS經由HTTP進行通信,但利用SSL/TLS來加密數據包。H…

    Linux干貨 2017-08-07
  • 馬哥教育網絡班22期+第4周課程練習 忍者亂太郎喻成

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。   cp -rp /etc/skel /home/tuser1   chmod -R 700 /home/tuser1 2、…

    Linux干貨 2016-10-09
  • VIM入門及進階

    什么是VIM?     VIM類似于Vi編輯器, 它是一個功能強大、可高度定制的文本編輯器, 是一個純粹的自由軟件。注意:vi和vim不完全相同 為什么要使用VIM?     相信大多數人接觸Linux時使用的第一個文本編輯器都不是VIM,很多人看到VIM復雜的命令操作就望而祛步…

    系統運維 2016-03-04
欧美性久久久久