SHELL基本文法2

來源:互聯網
上載者:User
Shell文法
變數:
   在Shell中,我們在使用變數之前並不需要進行聲明.相反我們可以在需要的時候進行簡單的使用就可以了.在預設的情況下,所有的變數都是作為字串進行 儲存的,雖然有時我們會用數字為其賦值.Shell以及其他的一些實用的轉換程式會將數字字串轉換成相應的值為進行操作.在Linux系統中是要區分大 小的,所以在Shell看來變數foo與Foo是不同的.
   在Shell中我們要訪問變數的值,我們要在變數前加上一個$.當我們要為變數賦值時,我們可以只使用變數的名字,Shell會在需要的時候進行動態建立.檢測變數內容一個簡單的辦法就是在終端進行輸出,這時要在變數前加上一個$.

在命令列中我們可以用下面的方法來設定和檢測變數的值:
$ salutation=Hello
$ echo $salutation
Hello
$ salutation=”Yes Dear”
$ echo $salutation
Yes Dear
$ salutation=7+5
$ echo $salutation
7+5
   我們還可使用read命令將使用者的輸入賦值給變數.這樣就會將變數的名字作為參數並會等待使用者的輸入.read命令會在使用者輸入斷行符號的時候結束.當從終端讀入變數時我們並不需要使用引號.如下面的例子:
$ read salutation
Wie geht’s?
$ echo $salutation
Wie geht’s?

引號:
   在繼續我們的學習之前我們要清楚引號的作用.
通常指令碼中的參數是由空白字元來分隔的,如空格,Tab或是斷行符號.如果我們要我們的參數包含一個或是更多個參數,我們就要使用引號了.
   例如變數$foo的行為要看我們使用的引號的類型了.如果我們是用雙引號,在這一行執行時就會用他的值進行替換,而如果我們使用單引號就不會發生這樣的替換.我們還可以使用逸出字元\來除去$的特殊意義.
在通常的情況下,我們雙引號來包含字串,這樣就可以防止變數被空白符所分隔,而且會用變數的值進行替換.
在下面的這個例子中我們就會看到引號對於變數輸出的影響:
#!/bin/bash
myvar=”Hi there”
echo $myvar
echo “$myvar”
echo ‘$myvar’
echo \$myvar
echo Enter some text
read myvar
echo ‘$myvar’ now equals $myvar
exit 0

這個程式的輸出為:
Hi there
Hi there
$myvar
$myvar
Enter some text
Hello World
$myvar now equals Hello World

工作原理
   我們建立了變理myvar,並賦值為Hi there.變數的內容由命令echo顯示出來,從而可以看出$字元擴充對變數內容的影響.從這輸出我們可以看出雙引號並不會影響變數的替換,而單引號和 反斜線卻會有這樣的影響.我們同時使用一個read命令來從使用者得到輸入.

環境變數
   當啟動一個Shell指令碼時,一些變數會由環境中的值進行初始化.在指令碼中這些變數通常為大寫字母,從而與使用者定義的變數進行區分,而使用者定義的變理常用小寫字母來表示.建立的變數依賴於我們個人的配置.其中的許多列在手冊頁中,但是基本的一些列在下面的表中:

$HOME    目前使用者的主目錄

$PATH    用來進行命令尋找的由冒號分隔的目錄列表

$PS1    命令提示,通常為$,但是在bash中我們可以使用更為複雜的值.例如,字串[\u@\h \W]$是流行的預設用法來告訴我們當前的使用者,機器名稱以及當前的工作目錄,同時給出$提示.

$PS2    第二提示符,當提示額外的輸入時使用,通常為>

$IFS    輸入地區分隔字元.當Shell讀入輸入時會使用一個字元列表來分隔輸入的單詞,通常是空格,tab和新行字元.

$0    Shell指令碼的名稱.

$#    傳遞的參數個數.

$$    指令碼的進程ID,通常用在一個指令碼內部用來建立唯一的一個臨時檔案,如/tmp/tmp-file_$$.
如果我們的指令碼調用一些參數,那麼會建立一些其他的變數.即使沒有傳遞參數,環境變數$#仍然存在,但是值卻為0.

參數變數列在下面這個表中:
$1,$2,...    傳遞給指令碼的參數.
$*    以單變數的形式顯示所有的參數列表,由環境變數IFS中的第一個字元分隔.
$@    $*的一個靈巧變形.他並不使用IFS環境變數,所以如果IFS為空白那麼所有的所有的參數會一起運行.

我們可以通過下面的測試容易的看出$@和$*的區別:
$ IFS=’’
$ set foo bar bam
$ echo “$@”
foo bar bam
$ echo “$*”
foobarbam
$ unset IFS
$ echo “$*”
foo bar bam
正如我們所看到的,在雙引號內,$@將參數進行分隔顯示,而與IFS的值無關.通常來說,如果我們要訪問參數,$@是一個很靈敏的選擇.
我們不僅可以用echo命令列印出變數的內容,而且我們可以使用read命令來讀取他們的內容.

參數和環境變數
   下面的指令碼展示了簡單變數的處理.在我們輸入了下面的指令碼內容並儲存為try_var,我們一定要記得用命令chmod +x try_var為其加上可執行許可權.
#!/bin/sh
salutation=”Hello”
echo $salutation
echo “The program $0 is now running”
echo “The second parameter was $2”
echo “The first parameter was $1”
echo “The parameter list was $*”
echo “The user’s home directory is $HOME”
echo “Please enter a new greeting”
read salutation
echo $salutation
echo “The script is now complete”
exit 0

如果我們運行這個指令碼我們會得到下面的輸出:
~$ ./try_var.sh foo bar baz
Hello
The program ./try_var.sh is now running
The second parameter was bar
The first parameter list was foo bar baz
The user's home directory is /home/mylxiaoyi
Please enter a new greeting
hello
The script is now complete

工作原理:
   這個指令碼建立了一個名為salutation的變數並顯示他的內空,然後顯示了各種參數變數,而環境變數$HOME已經存在並且已經有適當的值.函數:
   所有程式語言的基本原則是測試條件並在這些測試的基礎上進行各種不同的操作.在我們討論這個話題之前,我們先來看一下在Shell指令碼中我們會用到的函數構造以及我們要使用的控制結構.
一個Shell指令碼可以測試由命令列調用的任何命令的傳回碼,包括我們自己書寫的指令碼.這就是我們在每一個Shell指令碼最後包含exit代碼的重要原因.test或[命令:
    事實上,大多數的指令碼大量的使用了Shell真假檢測的test或是[命令.在大多數的系統上,[和test命令是同義的,但是當使用了一個[命令時而同 時為了可讀在末尾使用了一個]命令.使用[命令看起來有一點奇怪,但是這個命令在代碼中會使得命令的文法看起來要簡單,整潔,並且與其他的程式語言很相 像.

ls -l /usr/bin/[
-rwxr-xr-x 1 root root 25040 2005-11-16 21:17 /usr/bin/[

我們會使用一個簡單的測試例子來介紹test命令:檢測一個檔案是否存在.用於這個目的的命令是test -f <filename>,所以我們可以用下面的指令碼:

if test -f fred.c
then
...
fi

我們也可以像下面的樣子來寫:

if [ -f fred.c ]
then
...
fi

test命令的傳回碼(條件是否滿足)決定於條件代碼是否運行.

在這裡我們要注意是我們必須在[和條件之間用空格進行分隔.我們可以用下面的方法來記住這一點:[是test命令的另一種寫法,而我們要在test命令後輸入空格.

如果我們喜歡將then與if放在同一行,我們必須要加一個冒號來與then進行分隔:

if [ -f fred.c ]; then
...
fi

我們可以用的test命令的條件類型有以下的三種:字串比較,算術比較和檔案條件.下面的三張表展示了這些條件類型:

字串比較:
string1 = string2    如果相等則為真
string1 != string2    如果不等則為真
-n string        如果不空則為真
-z string        如果為空白則為真算術比較:
expression1 -eq expression2    如果相等則為真
expression1 -ne expression2    如果不等則為真
expression1 -gt expression2    如果大於則為真
expression1 -ge    expression2    大於等於則為真
expression1 -lt expression2    如果小於則為真
expression1 -le expression2    小於等於則為真
!expression            如查為假則為真檔案:
-d file        如果為目錄則為真
-e file        如果存在則為真(在這裡要注意的是,由於曆史原因,-e選項並不可移植,所以常用的是-f選項
-f file        如果為常規檔案則為真
-g file        如果設定了組ID則為真
-r file        如果檔案可讀則為真
-s file        如果檔案大小不為零則為真
-u file        如果設定了使用者ID則為真
-w file        如果檔案可寫則為真
-x file        如果檔案可執行則為真
現在我們似乎走得有一點的太前了,但是接下來的是一個例子.在這裡我們要測試檔案/usr/bash,這樣我們就可以清楚的看到這些條件的用法:#!/bin/sh
if [ -f /bin/bash ]
then
   echo “file /bin/bash exists”
fi
if [ -d /bin/bash ]
then
   echo “/bin/bash is a directory”
else
   echo “/bin/bash is NOT a directory”
fi

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.