亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

linux學習之linux百問2,不斷更新

系統 2754 0

1、 for/do/done?

?

Shell腳本的 for 循環結構和C語言很不一樣,它類似于某些編程語言的 foreach 循環。例如:

    #! /bin/sh



for FRUIT in apple banana pear; do

  echo "I like $FRUIT"

done
  

FRUIT 是一個循環變量,第一次循環 $FRUIT 的取值是 apple ,第二次取值是 banana ,第三次取值是 pear 。再比如,要將當前目錄下的 chap0 、 chap1 chap2 等文件名改為 chap0~ 、 chap1~ 、 chap2~ 等(按慣例,末尾有~字符的文件名表示臨時文件),這個命令可以這樣寫:

    $ for FILENAME in chap?; do mv $FILENAME $FILENAME~; done
  

也可以這樣寫:

    $ for FILENAME in `ls chap?`; do mv $FILENAME $FILENAME~; done
  

2、 while/do/done

?

while 的用法和C語言類似。比如一個驗證密碼的腳本:

    #! /bin/sh



echo "Enter password:"

read TRY

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

  echo "Sorry, try again"

  read TRY

done
  

下面的例子通過算術運算控制循環的次數:

    #! /bin/sh



COUNTER=1

while [ "$COUNTER" -lt 10 ]; do

  echo "Here we go again"

  COUNTER=$(($COUNTER+1))

done
  

Shell還有until循環,類似C語言的do...while循環。本章從略。

3、 位置參數和特殊變量

有很多特殊變量是被Shell自動賦值的,我們已經遇到了 $? $1 ,現在總結一下:

常用的位置參數和特殊變量

$0 相當于C語言 main 函數的 argv[0]
$1 、 $2 ... 這些稱為位置參數(Positional Parameter) ,相當于C語言 main 函數的 argv[1] argv[2] ...
$# 相當于C語言 main 函數的 argc - 1 ,注意這里的 # 后面不表示注釋
$@ 表示參數列表 "$1" "$2" ... ,例如可以用在 for 循環中的 in 后面。
$? 上一條命令的Exit Status
$$ 當前Shell的進程號

?

位置參數可以用 shift 命令左移。比如 shift 3 表示原來的 $4 現在變成 $1 ,原來的 $5 現在變成 $2 等等,原來的 $1 、 $2 $3 丟棄, $0 不移動。不帶參數的 shift 命令相當于 shift 1 。例如:

    #! /bin/sh



echo "The program $0 is now running"

echo "The first parameter is $1"

echo "The second parameter is $2"

echo "The parameter list is $@"

shift

echo "The first parameter is $1"

echo "The second parameter is $2"

echo "The parameter list is $@"
  

4、函數

和C語言類似,Shell中也有函數的概念,但是函數定義中沒有返回值也沒有參數列表。例如:

      #! /bin/sh



foo(){ echo "Function foo is called";}

echo "-=start=-"

foo

echo "-=end=-"
    

注意函數體的左花括號{和后面的命令之間必須有空格或換行,如果將最后一條命令和右花括號 } 寫在同一行,命令末尾必須有;號。

在定義 foo() 函數時并不執行函數體中的命令,就像定義變量一樣,只是給 foo 這個名字一個定義,到后面調用 foo 函數的時候(注意Shell中的函數調用不寫括號)才執行函數體中的命令。Shell腳本中的函數必須先定義后調用,一般把函數定義都寫在腳本的前面,把函數調用和其它命令寫在腳本的最后(類似C語言中的 main 函數,這才是整個腳本實際開始執行命令的地方)。

Shell函數沒有參數列表并不表示不能傳參數,事實上,函數就像是迷你腳本,調用函數時可以傳任意個參數,在函數內同樣是用 $0 $1 $2 等變量來提取參數,函數中的位置參數相當于函數的局部變量,改變這些變量并不會影響函數外面的 $0 、 $1 、 $2 等變量。函數中可以用 return 命令返回,如果 return 后面跟一個數字則表示函數的Exit Status。

下面這個腳本可以一次創建多個目錄,各目錄名通過命令行參數傳入,腳本逐個測試各目錄是否存在,如果目錄不存在,首先打印信息然后試著創建該目錄。

      #! /bin/sh



is_directory()

{

  DIR_NAME=$1

  if [ ! -d $DIR_NAME ]; then

    return 1

  else

    return 0

  fi

}



for DIR in "$@"; do

  if is_directory "$DIR"

  then :

  else

    echo "$DIR doesn't exist. Creating it now..."

    mkdir $DIR > /dev/null 2>&1

    if [ $? -ne 0 ]; then

      echo "Cannot create directory $DIR"

      exit 1

    fi

  fi

done
    

注意 is_directory() 返回0表示真返回1表示假。


?

linux學習之linux百問2,不斷更新


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 婷婷激情网站 | 九九久久国产精品大片 | 99影视网 | 呦系列视频一区二区三区 | 毛片a| 亚洲爱v | 久久久久嫩草影院精品 | 韩国三日本三级中文字幕 | 日日摸日日添夜夜爽97 | 国产精品自在自线免费观看 | 香蕉亚洲精品一区二区 | 日韩欧美国产高清 | 国产一区二区三区亚洲欧美 | 免费人成在线观看网站 | 一级毛片一级毛片 | 天天草夜夜草 | 久久精品一区二区影院 | 久久久久久综合七次郎 | 久久99九九| 视频一区亚洲 | 国产精品视频播放 | 综合激情婷婷 | 99久久精品免费看国产四区 | 日韩在线欧美在线 | 免费黄色在线 | 在线人成精品免费视频 | 99热久久久这里只有精品免费 | 色色视频网| 波多野结衣中文丝袜字幕 | 婷婷综合激情网 | 亚洲综合站 | 久久青草精品一区二区三区 | 操一操干一干 | 精品免费国产一区二区女 | 国产成人a在一区线观看高清 | 亚洲国产一区二区三区在线观看 | 日本欧美成 | 淫欲网| 国产亚洲综合精品一区二区三区 | 看个毛片 | 久久久久青草 |