以前的shell筆記

FreeeLinux發表於2017-09-04

小知識

  1. shell指令碼if中的表示式條件可通過man test檢視,比如-a就相當於&&。
  2. 2.

例項一:模擬登陸

#!/bin/bash
echo -n "login:"
read name
echo -n "password:"
read passwd
if [ $name = "wilcohuang" -a $passwd = "31415926yhwy." ];
then echo "the host and password is right"
else echo "input is error!"
fi

例項二:比較兩個數的大小

#!/bin/bash
echo "please enter two number"
read a
read b
if test $a -eq $b
then echo "no.1 = no.2"
elif test $a -gt $b
then echo "no.1 > no.2"
else echo "no.1 < no.2"
fi

例項三:搜尋某個目錄下檔案是否存在

#!/bin/bash
echo "enter a file name:"
read a
if test -e /data/home/wilcohuang/shell/$a
then echo "the file is exist!"
else echo "the file is not exist!"
fi

例項四:for迴圈的使用

#!/bin/bash
clear
for num in 1 2 3 4 5 6 7 8 9 10
do
    echo $num
done

例項五:命令列輸入

#!/bin/bash
echo "Please enter a user:"
read a
b=$(whoami)
if test $a = $b
then echo "the user is running"
else echo "the user is not running"
fi

例項六:刪除當前目錄下大小為0的檔案

#!/bin/bash
for filename in `ls`
do
    if test -d $filename
    then continue
    else a=$(ls -l $filename | awk '{print $5}')
        if test $a -eq 0
        then rm -rf $filename
        fi
    fi
done

例項七:如果某目錄下有檔案,那麼將其檔案系統大小改為3G

#!/bin/bash
while line=`ls /data/home/wilcohuang/shell/test1`
do
    if test $line = ""
    then echo "NULL"
        sleep 1
    else echo $line
        chfs -a size=3G /data/home/wilcohuang/shell/test1
        exit 0
    fi
done

例項八:測試IP地址

#!/bin/bash
for i in {1..9}
do
    echo "the number of $i computer is"
    ping -c 1 192.168.0.$i
done

ping: -c count次數

例項九:從0.sh中讀取內容並列印

#!/bin/bash
while read line
do
    echo $line
done < 0.sh

例項十:從0.sh中讀取內容並+1

#!/bin/bash
test -e 0.sh
while read line
do
    a=$line+1
    echo $a
done < 0.sh

例項十一:普通無引數函式

#!/bin/bash
p()
{
    echo "hello"
}
p

例項十二:給函式傳遞引數

#!/bin/bash
p_num()
{
    num=$1
    echo $num
}
for n in $@
do
    p_num $n
done

命令:bash para.sh 10

例項十三:獲取本機IP地址

ifconfig | grep 'inet addr:' | awk '{print $2}' | sed 's/addr://g'

`
[root@www ~]# sed [-nefr] [動作]
選項與引數:
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到終端上。但如果加上 -n 引數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。
-e :直接在命令列模式上進行 sed 的動作編輯;
-f :直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的 sed 動作;
-r :sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
-i :直接修改讀取的檔案內容,而不是輸出到終端。

動作說明: [n1[,n2]]function
n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』

function:
a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
d :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;
i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p :列印,亦即將某個選擇的資料印出。通常 p 會與引數 sed -n 一起執行~
s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!
`

例項十四:查詢最大檔案

#!/bin/bash
a=0
for name in *.*
do
    b=$(ls -l $name | awk '{print $5}')
    if test $b -ge $a
    then a=$b
        namemax=$name
    fi
done
echo "the max file is $namemax"

例項十五:查詢本網段的所有ip

a=1
while :
do
    a=$(($a+1))
    if test $a -gt 255
    then break
    else
        echo $(ping -c 1 10.204.172.$a | grep "ttl" | awk '{print $4}' | sed 's/://g')
        ip=$(ping -c 1 10.204.172.$a | grep "ttl" | awk '{print $4}' | sed 's/://g')
        if [ -n "$ip" ];
        then
            echo $ip >> ip.txt
        fi
    fi
done

注意:shell中比較字串必須加雙引號,否則結果不正確,正確做法如:

a=""
if [ -n "$a" ];
then
    echo 'yes'
else
    echo 'no'
fi

例項十六:case練習

#!/bin/bash
clear
echo "enter a numbe from 1 to 5:"
read num
case $num in
    1)echo "you enter 1"
        ;;
    2)echo "you enter 2"
        ;;
    3)echo "you enter 3"
        ;;
    4)echo "you enter 4"
        ;;
    *)echo 'default'
        ;;
esac

例項二十:yes/no返回不同結構

#!/bin/bash
clear
echo "enter [y/n]:"
read a
case $a in
    y|Y|Yes|YES)echo "you enter $a"
    ;;
    n|N|NO|no)echo "you enter $a"
    ;;
    *)echo 'error'
    ;;
esac

例項二十二:使用內建命令

#!/bin/bash
clear
echo "hello,$USER"
echo "Today's date id `date`"

例項二十三:列印所有沒有密碼的使用者

cat /etc/shadow | grep '!!' | awk -F ":" '{print $1}'

例項二十三:檢查埠號是否啟動

#!/bin/bash
n=1
echo "檢查nginx服務..."
while true
do
    if test $n -gt 20
    then
        echo "nginx服務啟動失敗"
        break
    fi

    sleep 5
    n=$(($n+1))
    port=`netstat -natp | grep "0.0.0.0:80"`
    if [ ${#port} -gt 3 ];
    then
        echo "nginx服務已經啟動"
        break
    fi
done

相關文章