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 09:29
下一篇 2016-08-22 09:29

相關推薦

  • varnish

    Web Page Cache: squid –> varnish程序的運行具有局部性特征:時間局部性:一個數據被訪問過之后,可能很快會被再次訪問空間局部性:一個數據被訪問時,其周邊的數據也有可能被訪問到 cache:命中 熱區:局部性;時效性:緩存空間耗盡:LRU過期:緩存清理 緩存命中率:hit/(hit+miss)(0,1)頁面命中率:…

    Linux干貨 2017-05-22
  • Linux網絡管理之路由和team網絡組

    如何實現把linux當路由器來使用,實現不同網段之間的通信訪問,這就是今天所要實現的路由配置   環境準備:4臺虛擬機,兩臺中間兩臺作為路由器來使用(每天主機兩塊網卡),其他兩臺作為終端主機,目的是讓不同網段的兩臺主機之間互相訪問(這里在vmware里面做的實驗,所以網卡的類型都設置為橋接)   拓撲圖:   步驟一:將A、D兩…

    系統運維 2016-09-10
  • Homework Week-10 CentOS啟動相關及bash腳本編程

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) 2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;   (1) 為硬盤新建兩個主分區;并為其安裝grub;   (2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;   (3) 為rootfs提供…

    Linux干貨 2016-10-24
  • java基礎篇—內存分析

    Java的并發采用的是共享內存模型(而非消息傳遞模型),線程之間共享程序的公共狀態,線程之間通過寫-讀內存中的公共狀態來隱式進行通信。多個線程之間是不能直接傳遞數據交互的,它們之間的交互只能通過共享變量來實現 同步是顯式進行的。程序員必須顯式指定某個方法或某段代碼需要在線程之間互斥執行。 1、多線程通信 1.1 內存模型 Java線程之間的通信由Java內存…

    Linux干貨 2015-03-16
  • linux 進程解析

    博文介紹了進程信息以及部分進程管理命令

    2017-09-09
欧美性久久久久