shell程式設計(2)

來源:互聯網
上載者:User

shell程式設計(2)Shell的文法變數

在shell裡,使用變數之前通常並不需要實現為他們做出聲明。預設情況下,所以變數都被看做字串來儲存,即使它們被賦值為數值也是如此。shell和一些工具程式會在需要時把數值型字串轉換為對應的數值以對它們進行操作。Linux大小寫敏感。

在shell中,我們可以通過在變數名前加一個$符號來訪問它的內容。無論何時想擷取變數的內容,我們都需要在它前面加上一個$字元。當為變數賦值時,我們只需要使用變數名。

如果字串裡包含空格,就必須用引號把他們括起來。還要注意在等號兩邊不能有空格。

我們可以通過使用read命令將使用者的輸入賦值給一個變數。這個命令需要一個參數,即準備讀入使用者的資料的變數名,然後它會等待使用者輸入資料。通常情況下,使用者按下斷行符號鍵時,read命令結束。

1. 使用引號

如果在一個參數中包含一個或多個空白符(例如,空格,定位字元或者分行符號),就必須給參上加上引號。像$myvar這樣的變數在引號中的行為取決於你所使用的引號類型。如果你把一個帶有$字元的變數放在雙引號中,程式執行到這一行就會把變數替換為它的值;如果你把它放在單引號中,就不會發生替換現象。還可以通過在$字元前機上一個\字元取消它的特殊含義。

字串通常放在雙引號中,以防止他們被空白符分開。

#! /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

HelloWorld

$myvar now equals Hello World

2. 環境變數

當一個shell指令碼程式開始運行時,一些變數會根據環境設定中的值進行初始化。這些變數通常用大寫字母做名字,以便區分使用者在指令碼程式裡定義的變數,後者按慣例用小寫字母做名字。

#HOME 目前使用者的主目錄

#PATH 以冒號分隔的用來搜尋命令的目錄列表

#PS1 命令提示字元,通常是$字元,但在bash中,你可以使用一些更複雜的值。#PS2 二級提示符,用來提示後續的輸入,通常是>字元

#IFS 輸入欄位分隔字元

$0 SHELL指令碼的名字

$# 傳遞給指令碼的參數個數

$$ shell指令碼的進程號

3. 參數變數

$1,$2… 指令碼程式的參數

$* 在一個列表中列出所有的參數,各個參數之間用環境變數IFS的第一個字元分隔開

$@ 它是$*的一種精巧的變換,不使用IFS,使用當IFS為空白時,參數的值也不會結合在一起。

可以通過下面這個例子看出$*和$@的區別

chen123@ubuntu:~/C++$ IFS=''

chen123@ubuntu:~/C++$ set foo bar bam

chen123@ubuntu:~/C++$ echo "$@"

foo bar bam

chen123@ubuntu:~/C++$ echo "$*"

foobarbam

chen123@ubuntu:~/C++$ unset IFS

chen123@ubuntu:~/C++$ echo "$*"

foo bar bam

chen123@ubuntu:~/C++$

實驗:參數和環境變數

指令碼程式:

#! /bin/sh

salutation="Hello"

echo $salutation

echo "The program $0 is nowrunning"

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 newgreeting"

read salutation

echo $salutation

echo "The script is now complete"

exit 0

輸出結果:

Hello

The program ./hird is now running

The second parameter was

The first parameter was

The parameter list was

The user's home directory is /home/chen123

Please enter a new greeting

SIre

SIre

The script is now complete

條件test或[命令

為增強可讀性,當使用[時,我們還是用符號]來結尾。

我們以一個最簡單的條件為例來介紹test命令的用法:檢查一個檔案是否存在。用於實現這一操作的命令是test –f <filename>,所以在指令碼程式裡我們寫出如下的代碼:

if test –f fred.c

then

fi

或用[可以寫成如下:

if [ -f fred.c ]

the

fi

注意必修在[符號和被檢查的條件之間留出空格。

test命令可以使用的條件類型可以歸為三類:字串比較、算術比較和與檔案有關的條件測試。

舉例如下:

#! /bin/sh

if [ -f /bin/bash ]

then

echo "file /bin/bash exits"

fi

 

if [ -d /bin/bash ]

then

echo "/bin/bash is a directory"

else

echo "/bin/bash is NOT a directory"

fi

輸出:

file /bin/bash exits

/bin/bash is NOT a directory

控制結構if語句:

if condition

then

statements

else

statements

fi

elif語句

if condition

then

statements

elif condition

statements

else

statements

fi

for語句

for variable in values

do

statements

done

實驗:使用固定字串的for迴圈

for variable in values

do

statements

done

輸出:

bar

fud

43

實驗:使用萬用字元擴充的for迴圈

#! /bin/sh

for file in $(ls f*.sh);

do

lpr$file

done

exit 0

這個例子示範了$(command)用法。for命令的參數表來自括在$()中的命令的輸出結果。

while語句

while condition do

statements

done

until語句

until condition

do

statement

done

case語句

case variable in

pattern[ | pattern]…) statements;;

pattern[ | pattern]…) statements;;

esac

命令列表

AND列表

statement && statement2 && statements && …

OR列表

statement || statement || statement || …

語句塊

如果你想在某些只允許使用單個語句的地方使用多條語句,可以把它們括在括弧{}中構造一個語句塊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.