12-Shell腳本_練習

變量 :
  • 使用變量時, 必須在變量名前加$
  • 用戶自定義變量 :
    • 沒有數據類型和存儲類型
    • 直接定義使用, 在定義時必須賦值
    • 在 = 的左右兩端不要出現空格符
    • 如果值出現空格, 需要使用” “
  • echo $var : 不關心不可見字符
  • echo “$var” : 原樣輸出
*exit : 退出 , 結束
* 一條命令的輸出結果作爲值賦給變量時, 需要使用 ` ` (命令置換符)
vi 分屏 :
  • 處於vi界面; 在底行模式 vsp 文件名
  • 注意文件必須在當前路徑下, 文件名個數只能爲一個.
  • 在命令行, vi -o 文件名….
  • vi -O 文件名
位置變量 :
  • $? : 獲取上一條命令的執行狀態,
  • 0 : 代表執行成功 , 1或者其他非零值:失敗或者出錯
輸入 : read 變量定義
輸出 : echo 變量引用
數據運算 :
  • expr : + - *(乘法運算符) / %
  • 在使用expr命令進行運算時, 在運算符左右兩端至少有一個空格符存在
  • expr num1+ num2 ==== ((num1 + num2))
test 語句 :
  • 字符串 整數 文件屬性
  • 字符串 : =
  • test 字符串1 =或者!= 字符串2 === [ 字符串1 =或者!= 字符串2 ]
  • 注意 : 在[ 的右端 和 ] 的左端 至少有一個空格符存在 .
  • test 數字1 選項 數字2
  • 兩條test語句時, 用&& 表示與 ; 用 || 表示 或
  • 一條test語句時, 用-a 表示與 ; 用 -o 表示 或
獲取測試結果, $? 0 : 成立 1 : 不成立
條件 :

-eq (等於)

-ne (不等於)

-gt (大於)

-ge (大於等於)

-lt (小於)

-le (小於等於)

文件屬性 :
test 選項 文件名

-r

-w

-x

-d

-f

-e

結構性語句:
if 語句  
then
    命令列表
fi
if 命令
then
    命令列表1
else if
then
    命令列表2
else
    命令列表n
fi
fi
case 變量的引用 in
    模式1)      # 允許 模式1 | 模式2 | 模式3) 的使用.
        命令列表1
        ;;      #  注意: ;;不能夠省略, 作用強制跳出case語句的執行.
    模式2)
        命令列表2
        ;;
    模式3)
        命令列表3
        ;;
        *)      # 注意 \* 出現的位置.
        命令列表n
        ;;      # 處於case語句結尾的;; 可以省略
esac

循環 :

執行: 變量從單詞表中取出單詞, 每取一次,循環執行一次;直到所有單詞被依次取一遍結束, 循環結束.
while 命令
do
    命令列表
done

while :
do
    命令列表
done    # 死循環 , : 不能夠省略

until


for 變量的定義 in  單詞表
do
    命令列表
done

for 變量的定義
do
    命令列表
done     
單詞表部分有命令行輸入 , 此時for循環執行次數由命令行傳入參數個數決定.
break : 支持跳出多層循環.
continue : 支持結束多層循環的當前次循環.

函數

  • 函數 : 沒有返回值類型 以及 參數類型
  • 在函數體內部沒有 return 語句
function fun()   # function 可以省略不要
{
    命令列表
}
  • 函數使用:
  • fun
  • 或者
  • info=`fun`
  • echo $info

  • 局部變量 : local 變量名

  • 在函數體內部有return語句,如果返回的爲整數, 其取值範圍在 0 ~ 255
  • 函數使用:
fun
echo $?


fun
var=$?
echo $var

練習 :

1.在家目錄下創建文件夾 file_dir 和 dir_dir , 創建前, 判斷文件夾file_dir 和 dir_dir 是否存在 ; 存在, 刪除重新創建; 不存在, 直接創建 , 輸入一個字符串, 當作目錄文件進行處理;判斷輸入是否爲目錄文件, 不是-> 報錯退出; 是->把該目錄下的目錄文件、普通文件分別拷貝到 dir_dir 、file_dir ; 並且統計目錄文件以及普通文件的個數.
#!/bin/bash  

if [ -e $HOME/file_dir ]
then
    rm -rf $HOME/file_dir
fi

if [ -e $HOME/dir_dir ]
then
    rm -rf $HOME/dir_dir
fi

mkdir $HOME/file_dir
mkdir $HOME/dir_dir

echo -n "請輸入一個目錄名 : "
read dirname

num1=0
num2=0
if [ -d $dirname ]
then
#   cd $dirname
    str=`ls $dirname`
    for var in $str
    do
        if [ -f $dirname/$var ]
        then
            cp $dirname/$var $HOME/file_dir
            ((num1++))
        else if [ -d $dirname/$var ]
        then
            cp -a $dirname/$var $HOME/dir_dir
            ((num2++))
        else
            echo "該文件爲其他類型, 不做處理"
        fi
    fi
done
else
    echo "該文件不存在或者不是目錄文件"
fi

echo "該目錄下普通文件個數爲: $num1"
echo "該目錄下目錄文件個數爲: $num2"
2.check_user : 檢查獲取到的用戶(/etc/passwd)是否存在, 存在,返回用戶信息所在的行號; 不存在, 返回 0 , show_user : 獲取check_user返回的行號, 並顯示出對應用戶的信息(用戶名, UID,GID) , 循環獲取輸入, 判斷用戶是否存在 (調用 check_user 函數) ; 如果存在, 顯示其信息 (show_user) ; 不存在, 提示, 重新輸入 , 直到輸入的爲 quit ; 程序結束.
#!/bin/bash  

function check_user()
{
    eist=`cat /etc/passwd | cut -d ':' -f 1 | grep "^$1$" -n | cut -d ":" -f 1 | wc -l`
    if [ $eist -eq 0 ]
    then
        return 0
    else
        line=`cat /etc/passwd | cut -d ":" -f 1 | grep "^$1$" -n | cut -d ":" -f 1`
        return $line
    fi
}

function show_user()
{
    info=`cat /etc/passwd | head -$1 | tail -1 | cut -d ":" -f 1,3,4`
    echo "$info"
}
while :
do
    echo -n "請輸入一個用戶名 : "
    read username

    if [ $username = "quit" ]
    then
        break
    fi
check_user $username
ret=$?

if [ $ret -eq 0 ]
then
    echo "該用戶不存在, 請重新輸入"
    continue
fi

show_user $ret
done
3.輸入一個成績(0 ~ 100), 90 ~ 100 A , 80 ~ 90 B , 60 ~ 80 C , 60 以下 NO PASS
#!/bin/bash  

echo -n "請輸入一個成績: "
read score

if [ $score -gt 100 -o $score -lt 0 ]
then
    echo "輸入有誤"
    exit
fi

if [ $score -ge 90 -a $score -le 100 ]
then
    echo A
else if [ $score -ge 80 ]
then
    echo B
else if [ $score -ge 60 ]
then
    echo C
else
    echo "NO PASS"
fi
fi
fi
4.輸入一個字符串, 當作文件名進行處理 判斷文件是否存在, 不存在, 報錯退出 exit ;如果存在, 判斷該文件是否爲普通文件, 是 ; 打印提示信息 不是, 繼續判斷是否爲目錄文件, 是 , 打印 delete it ? [ y | n] 獲取輸入, y -> 刪除文件夾, n -> 不刪除文件夾 , 其他字符 , 報錯退出.
#!/bin/bash  

echo -n "請輸入一個文件名 : "

read fname

if [ ! -e $fname ]
then
    echo "該文件不存在"
    exit
else if [ -f $fname ]
then
    echo "該文件爲普通文件"
else if [ -d $fname ]
then
    echo -n "delete it ? [y | n]"
    read ans
    if [ $ans = "y" ]
    then
        rm -rf $fname
    else if [ $ans = "n" ]
    then
        echo "該文件不需要刪除"
    else
        echo "輸入有誤"
        exit
    fi
fi
else
    echo "該文件爲其他類型文件"
fi
fi
fi
5.在家目錄下創建文件夾: dir 把/etc/passwd 和 /etc/group 拷貝 到 dir中 ; 備份文件夾dir 爲 dir_bak ; 打包壓縮文件夾 dir_bak 爲 dir_bak.tar.gz ; 把dir_bak.tar.gz 複製到 / , 刪除文件夾 dir
cd

mkdir dir

cp /etc/passwd dir
cp /etc/group dir

cp -a dir dir_bak

tar -czvf dir_bak.tar.gz dir_bak

sudo cp dir_bak.tar.gz /

rm -rf dir
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章