Linux Shell編程學習筆記(3)

Linux Shell編程學習筆記(2015-7-19)

分類:linux shell

一:位置參數和特殊變量

  什麼是位置參數?
  位置參數也叫位置變量,是運行shell腳本程序時,命令行shell傳遞給腳本的參數,以及在shell腳本程序中調用函數時傳遞給函數的參數。這些位置變量的名稱很特別,是以0,1,2,3….這些整數命名的。
  位置變量的數字與參數出現的具體位置相對應:0對應命令名,1對應第一個實參,2對應第二個實參…以此類推。響應地,使用0, 1, 2...使 {10}, ${11}。
  幾個特殊含義的shell變量

特殊變量 含義
$# 命令行上參數的個數,但不包含shell腳本名本身
| 0
@|1 0。如果放在雙引號中進行擴展,則“@ 1”,“2 3”…等效。
$? 上一條命令執行後的返回值
$$ 運行腳本的當前進程的進程號
$! 上一個後臺命令對應的進程號
$- 由當前shell設置的執行標誌名組成的字符串

比如下面的一個shell程序posvar.sh

#! /bin/bash
echo 'Parameter number:' $#
echo 'All digit variables:' $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11}
echo '$*:' $*
echo 下面輸出'$@'的所有內容
echo $@

它的運行結果如下:

biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./posvar.sh 1 2 3 4 5 6 7 8 9 10 11
Parameter number: 11
All digit variables: ./posvar.sh 1 2 3 4 5 6 7 8 9 10 11
$*: 1 2 3 4 5 6 7 8 9 10 11
下面輸出$@的所有內容
1 2 3 4 5 6 7 8 9 10 11
biantiao@lazybone1994-ThinkPad-E430:~/sh$

  使用set命令間接地設置除$0以外的位置變量的值。
比如下面的例子setvar.sh

#! /bin/bash
set learning linux shell
echo $0 $1 $2 $3

它的運行結果爲:

biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./setvar.sh
./setvar.sh learning linux shell
biantiao@lazybone1994-ThinkPad-E430:~/sh$

  shell還內置了一個shift命令,用來向左移動位置參數,即:原來的3 2,原來的2 1,$1的值永遠丟失。以此類推。結果是參數的個數少了一個。
比如下面的shiftposvar.sh:

#! /bin/bash
set learning linux shell
echo "Parameter number: $#, there are:"
echo $1 $2 $3
shift
echo  位置參數向左移動一位後,參數的情況爲:
echo "Parameter number: $#, there are:"
echo $1 $2 $3

它的運行結果爲:

biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./shiftposvar.sh
Parameter number: 3, there are:
learning linux shell
位置參數向左移動一位後,參數的情況爲:
Parameter number: 2, there are:
linux shell
biantiao@lazybone1994-ThinkPad-E430:~/sh$

二:read命令

  Linux Shell提供了read命令用於從鍵盤上讀取數據並賦值給指定變量。利用read命令可以編寫交互式的腳本程序。read命令的一般格式是:
read 變量1 [變量2...]
  注意:輸入數據時,數據項之間應該以空格或者製表符作爲分隔符。
  變量個數與數據個數之間可能出現以下三種情況:
- 變量個數與給定數據個數之間相同,則依次賦值。例如:

biantiao@lazybone1994-ThinkPad-E430:~$ read a b c
linux shell programming
biantiao@lazybone1994-ThinkPad-E430:~$ echo $a $b $c
linux shell programming
biantiao@lazybone1994-ThinkPad-E430:~$
  • 變量個數少於數據個數,則從左至右對應賦值,但最後一個變量被賦予剩下的所有數據。例如:
biantiao@lazybone1994-ThinkPad-E430:~$ read a b c
learning linux shell programming
biantiao@lazybone1994-ThinkPad-E430:~$ echo $a $b $c
learning linux shell programming
biantiao@lazybone1994-ThinkPad-E430:~$ echo $c
shell programming
biantiao@lazybone1994-ThinkPad-E430:~$
  • 變量個數多於給定的數據個數,則依次對應賦值,而沒有數據與之對應的變量取空串。例如:
biantiao@lazybone1994-ThinkPad-E430:~$ read a b c
linux shell
biantiao@lazybone1994-ThinkPad-E430:~$ echo $a $b
linux shell
biantiao@lazybone1994-ThinkPad-E430:~$ echo $c

biantiao@lazybone1994-ThinkPad-E430:~$

三:export語句

  首先先來說說Linux中的變量的可見性。
  在linux中用戶可以在腳本或着命令行上定義一些變量並賦值,包括改變環境變量。在同一shell中,變量值是可見的;但在子shell中,父shell的變量是不可見的。例如下面的例子,在child.sh的腳本當中將要顯示str的值。bash運行該腳本時將創建一個子進程。但腳本中要求顯示的str是shell當中的變量,它並不在子進程中。我們來看看會有什麼結果。

biantiao@lazybone1994-ThinkPad-E430:~$ cd sh
biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat child.sh
#! /bin/bash
echo $str

biantiao@lazybone1994-ThinkPad-E430:~/sh$ str="parent shell variable"
biantiao@lazybone1994-ThinkPad-E430:~/sh$ bash child.sh

biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./child.sh

biantiao@lazybone1994-ThinkPad-E430:~/sh$ source child.sh
parent shell variable
biantiao@lazybone1994-ThinkPad-E430:~/sh$

說明:上面出現了source命令,使用source命令來運行了child.sh腳本。我們來複習一下source命令:source命令是shell的內部命令,使用它來執行腳本系統不會創建新的進程,也即:使用source命令執行的腳本在當前的進程中被執行。所以以上的實例中使用source命令執行的腳本仍然可以將str顯示出來。
  總結來說就是:在命令行上輸入的命令都是由相應的進程執行的,即父進程創建子進程,子進程完成該命令的功能。然而,子進程執行時的環境與父進程的環境往往不同。一個進程在自己的環境中定義的是局部變量,僅限於自身的範圍,不能傳遞給其子進程。父進程定義的變量對其子進程的運行環境不產生任何影響。
  那麼問題來了,怎樣才能使各個子進程能夠繼承父進程中定義的變量呢?答案是:使用export命令。在父進程中使用export命令將要在子進程中使用的變量轉出到進程轉出區(子進程可以繼承父進程中的轉出區中的數據)。
  export命令的一般格式是export 變量名。舉個例子:

biantiao@lazybone1994-ThinkPad-E430:~$ cd sh
biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat child.sh
#! /bin/bash
echo $str

biantiao@lazybone1994-ThinkPad-E430:~/sh$ str="來自父進程中的變量str"
biantiao@lazybone1994-ThinkPad-E430:~/sh$ export str
biantiao@lazybone1994-ThinkPad-E430:~/sh$ bash child.sh
來自父進程中的變量str
biantiao@lazybone1994-ThinkPad-E430:~/sh$

說明:在同一個export命令行上可以有多個變量名。子shell中可以讀取但無法改變父shell中export出來的變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章