shell編程基礎知識(三)

---來源於網絡整理

0、前言

1)shell 語句中寫在一行中,各命令之間需要用分號隔開;------適用於在終端中直接執行命令;

shell語句中按照縮進寫多行,段落清晰,不需加分號;-------適用於寫在腳本文件中;

2)執行腳本文件的方法,當不添加腳本的可執行權限的時候,用點命令執行腳本最簡單;

當添加文件的可執行權限時,./腳本執行;

第一行加#!/bin/sh的時候,是執行腳本解析器;

第一行沒加#!/bin/  的時候,會採用默認腳本解析器;通過echo   $SHELL  命令查看。

3)echo 可以打印輸出,printf也可以打印輸出

echo "\n"  會將\n打印輸出;

printf"\n"會換行。

echo默認會輸出換行的。printf 默認不會輸出換行。

 

1、條件結構

共有5個關鍵字 :    if  then  elif  else  fi

示例1:

if  [ -d  Desktop ] ; then           ----------->有分號作爲結尾 ,如果then換行寫,則;可以省略

   echo  " this is dir"

elif [ -f Desktop ] ; then

   echo  "this is file"

else

     printf   “unkown\n”

fi

示例2:

if :; then echo "always true" fi             ------>冒號表示總爲真。

示例3:

echo " is it sunday? please answer yes or no"

      read  YES_OR_NO                     ---------------->read 相當於scanf, 等待用戶輸入,此變量不需要單獨初始化

if [ "$YES_OR_NO" = "yes" ] ;then  ---------------->分號是因爲與then同行,分行的話,不需要分號

  echo "hello"

elif [ "$YES_OR_NO" = "no" ] ;then

    echo "world"

else 

   echo "sorry"

    exit 1                          --------------------->會直接退出終端;改成return 1,則不會退出終端

fi

     exit 0                        --------------------->會直接退出終端;改成return 0,則不會退出終端

2、case /esac

與c語言中的switch語句的區別:

1)沒有c語言中的 switch關鍵字;

2)使用兩個分號;; 來代替c語言中的break的作用。

示例:

echo "please answer yes or no"

read YSE_OR_NO

case "$YSE_OR_NO" in

yes|y|Y|YES|Yes)              ----------------------》只有右括號,表示集合

     echo "hello";;

[nN]? )

    echo "world";;

*)                             -------------------------------------->相當與switch 語句中的default

  echo "sorry"

   return 1;;

esac

return 0

小結:case 中的各種情況使用右半括號寫,跟我們平時用的1)   2)   3)  類似。

3、for循環結構

for/do/done

   for循環與C語言中的for不同,shell中的for是循環遍歷,沒有類似C語言中的起始條件,終止條件,等

for FRUIT in apple  banana  pear ; do    ---------加了分號是因爲與do在一行,如果分行的話,就可以去掉分號

    echo "this is  $FRUIT"

done

小結1:變量FRUIT 循環取 in中的值;do 相當於C語言中for循環的左大括號,done相當於右大括號;

示例1:將當前文件中的chap0、chap1文件名改爲chap0~、chap1~

for FILENAME in chap?;do

        mv $FILENAME  $FILENAME~ 

 done

******************上述示例等價於下邊的例子。

for FILENAME in `ls chap?`;do

        mv $FILENAME  $FILENAME~      ------>使用mv命令是修改文件名

 done

小結2:for循環中,in 後面的是個集合;

測試:當前目錄中有chap0、chap1、chap2 ,但沒有以apple、banana 、pear開頭的文件, 

 也就是說 in 後的集合,如果是模糊匹配,會到當前目錄中查找文件名,沒有匹配上會原樣輸出;匹配上會輸出匹配的文件。

4、while循環結構

while do done-------與C語言的while類似,表達式爲真,則執行;

echo  "enter password"

read TRY

while [ "$TRY" != "secret" ];do

    echo "sorry,try again"

    read TRY

done

 

 

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