shell編程學習

在通常狀況下,人們並不區分 Bourne Shell 和 Bourne Again Shell,因此,像 #!/bin/sh,它一樣也能夠改成 #!/bin/bashphp

#! 告訴系統其後路徑所指定的程序便是解釋此腳本文件的 Shell 程序。html

 

運行 Shell 腳本有兩種方法:

一、做爲可執行程序linux

將上面的代碼保存爲 test.sh,並 cd 到相應目錄:git

chmod +x ./test.sh #使腳本具備執行權限 ./test.sh #執行腳本

注意,必定要寫成 ./test.sh,而不是 test.sh,運行其它二進制的程序也同樣,直接寫 test.sh,linux 系統會去 PATH 裏尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 裏,你的當前目錄一般不在 PATH 裏,因此寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統說,就在當前目錄找。shell

二、做爲解釋器參數編程

這種運行方式是,直接運行解釋器,其參數就是 shell 腳本的文件名,如:vim

/bin/sh test.sh /bin/php test.php

這種方式運行的腳本,不須要在第一行指定解釋器信息,寫了也沒用。bash

 

 

Shell 變量

定義變量時,變量名不加美圓符號($,PHP語言中變量須要),如:編輯器

your_name="runoob.com"



使用變量

使用一個定義過的變量,只要在變量名前面加美圓符號便可,如:post

your_name="qinjx" echo $your_name echo ${your_name}

變量名外面的花括號是可選的,加不加都行,加花括號是爲了幫助解釋器識別變量的邊界,好比下面這種狀況:

for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script" done

若是不給skill變量加花括號,寫成echo "I am good at $skillScript",解釋器就會把$skillScript當成一個變量(其值爲空),代碼執行結果就不是咱們指望的樣子了。

推薦給全部變量加上花括號,這是個好的編程習慣。

已定義的變量,能夠被從新定義,如:

your_name="tom" echo $your_name your_name="alibaba" echo $your_name

這樣寫是合法的,但注意,第二次賦值的時候不能寫$your_name="alibaba",使用變量的時候才加美圓符($)。

 

 

Shell 字符串

字符串是shell編程中最經常使用最有用的數據類型(除了數字和字符串,也沒啥其它類型好用了),字符串能夠用單引號,也能夠用雙引號,也能夠不用引號。單雙引號的區別跟PHP相似。

單引號

str='this is a string'

單引號字符串的限制:

  • 單引號裏的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
  • 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,做爲字符串拼接使用。

雙引號

your_name='runoob' str="Hello, I know you are \"$your_name\"! \n" echo -e $str

輸出結果爲:

Hello, I know you are "runoob"!

雙引號的優勢:

  • 雙引號裏能夠有變量
  • 雙引號裏能夠出現轉義字符

拼接字符串

your_name="runoob" # 使用雙引號拼接 greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 # 使用單引號拼接 greeting_2='hello, '$your_name' !' greeting_3='hello, ${your_name} !' echo $greeting_2 $greeting_3

輸出結果爲:

hello, runoob ! hello, runoob ! hello, runoob ! hello, ${your_name} !

獲取字符串長度

string="abcd" echo ${#string} #輸出 4

提取子字符串

如下實例從字符串第 2 個字符開始截取 4 個字符:

string="runoob is a great site" echo ${string:1:4} # 輸出 unoo



shell腳本例子集錦(習題總結)

 
練習一:寫一個腳本
       1.設定變量FILE的值爲/etc/passwd
       2.依次向/etc/passwd中的每一個用戶問好,而且說出對方的ID是什麼
        形如:(提示:LINE=`wc -l /etc/passwd | cut -d" " -f1`)
         Hello,root,your UID is 0.
       3.統計一個有多少個用戶
     答案一:#!/bin/bash
           file="/etc/passwd"
           LINES=`wc -l $file | cut -d" " -f1`
           for I in `seq 1 $LINES`;do
           userid=`head -$I $file | tail -1 |cut -d: -f3`
           username=`head -$I $file | tail -1 |cut -d: -f1`
           echo "hello $username,your UID is $userid"
           done
           echo "there are $LINES users"
     答案二:#!/bin/bash
           file=/etc/passwd
           let num=0
           for I in `cat $file`;do
           username=`echo "$I" | cut -d: -f1`
           userid=`echo "$I" | cut -d: -f3`
           echo "Hello,$username,your UID is $userid"
           num=$[$num+1]
           done
           echo "there are $num users"
練習二:寫一個腳本
      1.切換工做目錄至/var
      2.依次向/var目錄中的每一個文件或子目錄問好,形如:
        (提示:for FILE in /var/*;或for FILE in `ls /var`;)
        Hello,log
      3.統計/var目錄下共有多個文件,並顯示出來
  答案:#!/bin/bash
         cd /var
         let num=0
         for I in `ls /var/*`;do
         echo "hello $I"
         num=$[$num+1]
         done
         echo "the number of files is $num"
練習三:寫一個腳本
      1.設定變量file的值爲/etc/passwd
      2.使用循環讀取文件/etc/passwd的第2,4,6,10,13,15行,並顯示其內容
      3.把這些行保存至/tmp/mypasswd文件中
  答案:#!/bin/bash
       file="/etc/passwd"
       for I in 2 4 6 10 13 15;do
       exec 3>/tmp/mypasswd
       line=`head -$I $file | tail -1`
       echo "$line"
       echo "$line" >&3
       exec 3>&-
       done
練習四:寫一個腳本
       傳遞兩個整數給腳本,讓腳本分別計算並顯示這兩個整數的和,差,積,商
        答案以下:vim test.sh
                   #!/bin/bash
                    echo "first number $1"  (表示輸出第一個數)
                    echo "second number $2" (表示輸出第二個數)
                    echo " $(($1+$2))"      (輸出兩數之和)
                    echo "$[$1-$2]"         (輸出兩數之差)
                    echo "$[$1*$2]"         (輸出兩數之積)
                    echo "$[$1/$2]"         (輸出兩數之商)
                    :wq                    (表示保存並退出vi編輯器)
                    chmod +x test.sh       (給test.sh執行的權限)
                    ./test.sh 2 3          (傳遞兩個參數並執行腳本     
做業一:寫一個腳本:
       1.建立目錄/tmp/scripts
       2.切換工做目錄至此目錄中
       3.複製/etc/pam.d目錄至當前目錄,並重命名爲test
       4.將當前目錄的test及其裏面的文件和子目錄的屬主改成redhat
       5.將test及其子目錄中的文件的其它用戶的權限改成沒有任何權限
   答案:
       #!/bin/bash
       mkdir -v /tmp/scripts
       cd /tmp/scripts
       cp -r /etc/pam.d ./test
       chown -R redhat ./test
       chmod -R o=--- ./test
做業二:寫一個腳本
       1.顯示當前系統日期和時間,然後建立目錄/tmp/lstest
       2.切換工做目錄至/tmp/lstest
       3.建立目錄a1d,b56e,6test
       4.建立空文件xy,x2y,732
       5.列出當前目錄下以a,x或者6開頭的文件或目錄
       6.列出當前目錄下以字母開頭,後跟一個任意數字,然後跟任意長度字符的文件或目錄
   答案:
       #!/bin/bash
       date
       mkdir -pv /tmp/lstest
       cd /tmp/lstest
       mkdir a1d b56e 6test
       touch xy x2y 732
       ls [ax6]*
       ls [[:alpha:]][[:digit:]]*
             做業三:寫一個腳本         添加10個用戶user1到user10,但要求只有用戶不存在的狀況下才能添加   答案:        #!/bin/bash        for I in `seq 1 10`;do        cut -d: -f1 /etc/passwd |grep "user$I" 2>>/tmp/etc.err || useradd user$I        done 做業四:寫一個腳本        經過ping命令測試192.168.0.151到192.168.0.254之間的全部主機是否在線        若是在線,就顯示「ip is up」        若是不在線,就顯示「ip is down」       答案: #!/bin/bash        for I in `seq 151 254`;do        ping -c1 -w1 192.168.0.$I &>/dev/null && echo "192.168.0.$I is up" ||        echo "192.168.0.$I is down"        done
相關文章
相關標籤/搜索