在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 ,所以在指令碼程式裡我們寫出如下的**:
if test –f fred.c
then
fi或用[可以寫成如下:
if [ -f fred.c ]
thefi
注意必修在[符號和被檢查的條件之間留出空格。
test命令可以使用的條件型別可以歸為三類:字串比較、算術比較和與檔案有關的條件測試。
舉例如下:
#! /bin/sh
if [ -f /bin/bash ]
then
echo "file /bin/bash exits"
fiif [ -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
fielif語句
if condition
then
statements
elif condition
statements
else
statements
fifor語句
for variable in values
dostatements
done
實驗:使用固定字串的for迴圈
for variable in values
do statements
done
輸出:bar
fud實驗:使用萬用字元擴充套件的for迴圈
#! /bin/sh
for file in $(ls f*.sh);
dolpr$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 || …
語句塊如果你想在某些只允許使用單個語句的地方使用多條語句,可以把它們括在括號{}中構造乙個語句塊。
shell程式設計 2
編寫shell程式,實現自動刪除50個賬號的功能。賬號名為stud1至stud50。程式實現及注釋如下 bin bash deluser.sh 考察while迴圈 i 1while i le 50 do 檢視賬戶是否存在 只需要在 etc passwd檔案查詢就可以了。我是利用了乙個管道符,再利用g...
shell程式設計珠璣(2)
1 shell 呼叫 ftp load aaa.txt file sudo ftp n i v open ftpserver user ftpname ftppassword cd ftpdirectory lcd localdirectory mget aaa.txt quit end2 if 的...
shell程式設計學習2
朱老師物聯網大講堂 學習筆記 shell中呼叫linux命令 上節使用的就是直接使用,下面是通過呼叫這個值的方式,pwd pwd 注意此處是反引號,esc下面。echo pwd 結果就列印出了當前目錄是什麼,強調一點的是,如果我們希望我們的結果與其它的結合,就會用到雙引號,這沒錯,在這裡要特別說的是...