shell腳本編程小節及作業

使用read命令來接收輸入
    
    使用read來把輸入值分配給一個或多個shell變量:
        -p:指定要顯示的提示
        -t:timeout
    read 從標準輸入中讀取值,給每個單詞分配一個變量,
    所有剩余單詞都被分配給最后一個變量
    示例:
    read -p "Enter a filename: " File
多條件選擇if語句
    選擇執行,if語句可以嵌套
    格式:
    單分支
        if 判斷條件;then
            條件為真的分支代碼
        fi
    雙分支
        if 判斷條件;then
            條件為真的分支代碼
        else
            條件為假的分支代碼
        fi
    多分支
        if condition1(條件1);then
            if-true
        elif condition2;then
            if-true
        elif condition3;then
            if-true
            ...
        else
            all-false
        fi
    逐條件進行判斷,第一次遇為"真"條件時,執行其分支,而后結束整個if語句。
    
條件判斷:case語句
    
    適合離散值。
    case 變量引用 in        case支持glob風格的通配符
    PAT1)                       *:任意長度任意字符
        分支1                   ?:任意單個字符
        ;;                      []:指定范圍內的任意單個字符
    PAT2)                       a|b:a或b
        分支2
        ;;
    ...
    *)
        默認分支
        ;;
    esac
循環語句
    
    循環執行
        將某代碼段重復運行多次
        重復運行多少次:
            循環次數事先已知
            循環次數事先未知
        有進入條件和退出條件
    for,while,until
    
for循環
    
    for 變量名 in 列表;do
        循環體
    done
    執行機制:
        依次將列表中的元素賦值給"變量名";每次賦值后即執行一次循環體;直到列表中的元素耗盡,循環結束。
    列表生產方式:
        直接給出列表
        整數列表
            {start..end}
            $(seq [start[step]] end)
        返回列表的命令
            $(COMMAND)
        使用glob,如:*.sh
        變量引用
            $@,$*
函數
- function(){...COMMAND} 格式
- 調用直接寫上函數名
break
continue

作業
1. 編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。
```
#/bin/bash
HostInfo=`cat /etc/centos-release`
HostName=`hostname`
IPaddr=` ifconfig | grep "inet addr" | tr -s " " | head -1 | cut -d: -f2 | cut -d " " -f1`
OSinfo=`cat /etc/centos-release`
KernelInfo=`uname -r`
CpuInfo=`cat /proc/cpuinfo | grep "model name" | uniq | cut -d : -f2`
MemInfo=`cat /proc/meminfo | grep "MemTotal" | tr -s " "`
DiskSpace=`fdisk -l | grep "Disk" | grep /dev/sda | cut -d: -f2 | cut -d , -f1`
echo -e "HostInfo:\033[21;31m$HostInfo \033[0m"
echo -e "HostName:\033[32m$HostName \033[0m"
echo -e "IPaddr:\033[33m$IPaddr \033[0m"
echo -e "OSinfo:\033[34m$OSinfo \033[0m"
echo -e "KernelInfo:\033[35m$KernelInfo \033[0m"
echo -e "MemInfo:\033[36m$MemInfo \033[0m"
echo -e "DiskSpace:\033[41;37m$DiskSpace \033[0m"
```
2. 編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中
> ```
> #/bin/bash
> #復制目錄就在opt目錄下創建etc當天命名的文件夾
> #復制文件就在opt目錄下創建etc當天命名的文件
> BackupFile=/opt/etc`date +%F`
> cp -r /etc $BackupFile && echo "/etcFile備份完成"
> unset BackupFile
> ```
3. 編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值
> ```
> #/bin/bash
> declare -i Use
> Use=15
> Disk=`df | grep /dev/sda | tr -s " " | sort -nr -t " " -k5 | head -1 | cut -d " " -f1`
> DiskuseSpace=`df | grep /dev/sda | tr -s " " | sort -nr -t " " -k5 | head -1 | cut -d " " -f5` | sed "s/\([[:digit:]]\+\).*/\1/g"
> [[ "$DiskuseSpace" -gt "$Use" ]] && echo "磁盤空間不足,注意清理." && echo "空間利用率$Disk是最大值$DiskuseSpace."
> unset Use
> unset Disk
> unset DiskuseSpace
> ```
4. 編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序
> ```
> #/bin/bash
> netstat -tn | grep "tcp" | tr -s " " | cut -d " " -f5 | sed "s/\([0-1][0-9][1-9].\)\([0-1][0-9][1-9].\)\([1-9].\)\([0-1][0-9][1-9]\).*/\1\2\3\4/g" | wc -l | sort -nr
> ```
5. 寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和
> ```
> #/bin/bash
> sum1=`sed -n '10p' /etc/passwd | cut -d: -f3`
> sum2=`sed -n `20p` /etc/passwd | cut -d: -f3`
> let sum=$sum1+$sum2
> echo "UserID sum is $sum"
> ```
6. 寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和
> ```
> #/bin/bash
> echo "Give a one file Path:$1"
> echo "Give a two file Path:$2"
> sum1=`grep "^$" $1 | wc -l`
> sum2=`grep "^$" $2 | wc -l`
> let sum=$sum1+$sum2
> echo $sum
> ```
7. 寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件
> ```
> #/bin/bash
> read -p "Enter your FilePath:" A B C
> sum1=`ls -rA $A | wc -l`
> sum2=`ls -rA $B | wc -l`
> sum3=`ls -rA $C | wc -l`
> let sum=$sum1+$sum2+$sum3
> echo $sum1
> echo $sum2
> echo $sum3
> echo $sum
> ```
8. 寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數
> ```
> #/bin/bash
> read -p "請輸入Path:" A
> [ -z "$A" ] && echo "至少應該給一個參數"&& exit 13
> [ -n "$A" ] && spaceline=`grep "^$" $A | wc -l`
> echo "$spaceline"
> ```
9. 寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
> ```
> #/bin/bash
> ping -c3 $1 &> /dev/null && echo "該ip地址可以訪問" || echo "該ip地址不可訪問"
> ```
10. chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫
>  ```
> #/bin/bash
> read -p "Enter a file name:" File
> [ -r "$File" -a -w "$File" ] && echo "此用戶可讀可寫!" || echo "此用戶不可讀且不可寫。"
>  ```
11. 編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。
> ```
> #/bin/bash
> #ShellName nologin.sh
> Nologin=/etc/nologin
> [ -e $Nologin ] && echo "已禁止普通用戶登錄!" || touch $Nologin
> ```
> ```
> #/bin/bash
> #ShellName login.sh
> Login=/etc/nologin
> [ -e $Login ] && echo "禁止普通用戶登錄文件存在。";rm $Login
> ```
12. 寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
> ```
> #/bin/bash
> #Shell name hostping
> #author WZB
> echo "請輸入一個IP:$1"
> [[ -n "$1" ]] && echo "This IP is True!!" && ping -c3 $1 &>/dev/null && echo "$1可以訪問" || echo "$1不可以訪問" || echo "IP address is false";exit 13
> ```
13. 計算1+2+3+...+100的值
```
#/bin/bash
#author WZB
sum=0
for i in `seq 1 1 100`;do
    let "sum+=i"
done
echo "$sum"
#echo {1..100} | tr " " "+" | bc
```
14. 計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之
> ```
> #/bin/bash
> #author WZB
> echo "第一個參數A:$1"
> echo "第二個參數B:$2"
> 
> [[ $2 -gt $1 ]] && let sum=$2+$1 && echo "sum的值:$sum" || echo "B不大于A,已退出請重新執行。";exit3
> 
> unset sum
> ```
```
[[ $1 = ~\b[[:digit:]]+\b ]]匹配任意數字
```
```
seq -s(指定分隔符) + 1 10
```

原創文章,作者:真的可行(wzb),如若轉載,請注明出處:http://www.www58058.com/36186

(0)
真的可行(wzb)真的可行(wzb)
上一篇 2016-08-22
下一篇 2016-08-22

相關推薦

  • btrfs管理及應用

    一. 簡介     btrfs有著強大的功能,它支持在多個及各種物理設備(包括RAID)上創建一個文件系統,并支持動態擴展或減小,支持快照功能,甚至快照的快照,支持子卷功能。 二. 如何使用btrfs文件系統?     我的準備材料:3塊20G的硬盤 [root@localhost ~]#…

    Linux干貨 2015-12-07
  • N28-第二周博客作業

    常用通配符
    *:表示任意長度的任意字符;

    ?:表示任意的單個字符;

    []:表示在指定范圍內的單個字符:[a-z];

    [^]:脫字符,是取反的意思,即在指定范圍以外的任意字符,如 [^0-9]表示除數字以外的一切字符。

    [:digit:] 表示所有的數字,相當于0-9

    [:lower:] 表示所有的小寫字母

    [:upper:] 表示所有的大寫字母

    [:alpha:] 表示所有的字母,

    [:alnum:] 相當于[0-9a-z]

    [:space:] 相當于空白字符

    [:punct:] 表示所有的標點符號

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。

    2、bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容及其示例演示。

    3、請使用命令行展開功能來完成以下練習:

    (1)、創建/tmp目錄下的:a_c, a_d, b_c, b_d

    (2)、創建/tmp/mylinux目錄下的:
    mylinux/
    ├── bin
    ├── boot
    │?? └── grub
    ├── dev
    ├── etc
    │?? ├── rc.d
    │?? │?? └── init.d
    │?? └── sysconfig
    │?? └── network-scripts
    ├── lib
    │?? └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │?? └── local
    │?? ├── bin
    │?? └── sbin
    └── var
    ├── lock
    ├── log
    └── run

    4、文件的元數據信息有哪些,分別表示什么含義,如何查看?如何修改文件的時間戳信息。

    5、如何定義一個命令的別名,如何在命令中引用另一個命令的執行結果?

    6、顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間至少出現一位數字(可以有其它字符)的文件或目錄。

    7、顯示/etc目錄下,以任意一個數字開頭,且以非數字結尾的文件或目錄。

    8、顯示/etc目錄下,以非字母開頭,后面跟了一個字母以及其它任意長度任意字符的文件或目錄。

    9、在/tmp目錄下創建以tfile開頭,后跟當前日期和時間的文件,文件名形如:tfile-2016-05-27-09-32-22。

    10、復制/etc目錄下所有以p開頭,以非數字結尾的文件或目錄到/tmp/mytest1目錄中。

    11、復制/etc目錄下所有以.d結尾的文件或目錄至/tmp/mytest2目錄中。

    12、復制/etc/目錄下所有以l或m或n開頭,以.conf結尾的文件至/tmp/mytest3目錄中。

    Linux干貨 2017-12-11
  • 為你的網絡傳輸加把鎖(OpenSSL)

    互聯網形成的初期,更多關注的是設備之間通過網絡相互訪問功能的實現,我們都知道,兩個設備之間要想相互通信,就必需遵循某種協議,于是早期的互聯網也出現來眾多的協議,比如傳輸層最著名的協議就是tcp和udp,而應用層比較著名的協議有:http、ftp、pop、smtp、dns、telnet等等,而這些協議這開發初期,更多是關注功能的實現,數據這網絡上傳輸是明文方式…

    Linux干貨 2015-12-06
  • 標記2

    標記2

    Linux干貨 2018-03-11
  • 概述Windows2003的卷影副本

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://jeffyyko.blog.51cto.com/28563/157940      卷影副本,也就是Volume Shadow Server簡單來講,卷影副本(或稱為VSS)可以簡單…

    Linux干貨 2015-03-25
  • Linux程序包管理rpm、yum、源碼編譯

    概述:     眾所周知,Linux操作系統本身,必須要借助額外的一些軟件,才能完成某些應用的,操作系統如果沒有應用程序的填充,就無法創造出生產力,這樣即使再完美的操作系統,也毫無用處。那么本章就簡要介紹一下Linux系統上對程序包的管理,分為以下三個部分:     1、程序包的…

    Linux干貨 2016-08-24
欧美性久久久久