1. 程式人生 > >shell基礎05 處理用戶輸入

shell基礎05 處理用戶輸入

就是 done linu don clas new tin basename 運行

1. 命令行參數------類似javac 參數1 參數2

類似Java中編譯的javac parm1....。在shell中,參數與參數之間用空格隔開。采用位置參數來識別對應的參數值:$0是程序名,$1是第一個參數,以此類推,知道第9個參數$9。對於大於9個參數的需要在變量數字周圍添加花括號,比如${10}。

note:命令行上不僅可以處理數值,還可以處理字符串。

技術分享圖片
 1 [Hermioner@localhost Documents]$ cat test2.sh
 2 #!/bin/bash
 3 total=$[ $1*$2 ]
 4 echo The first parm is $1
5 echo The second parm is $2 6 a=$3 7 echo the third parm is $3 8 b=$4 9 echo the forth parm is $4 10 [Hermioner@localhost Documents]$ bash test2.sh 2 3 "hello world" min 11 The first parm is 2 12 The second parm is 3 13 the third parm is hello world 14 the forth parm is min
View Code 技術分享圖片
1 [Hermioner@localhost Documents]$ cat
test3 2 #!/bin/bash 3 echo the tenth parm is ${10} 4 echo the eleventh parm is ${11} 5 [Hermioner@localhost Documents]$ bash test3 1 2 3 4 5 6 7 8 9 10 11 6 the tenth parm is 10 7 the eleventh parm is 11 8 [Hermioner@localhost Documents]$
View Code

note: $0返回腳本名,如果用bash,就只返回腳本名;如果./腳本來運行,返回當前路徑名; 因此,還可以嘗試basename

命令來返回不包含路徑的腳本名。

2. $#,$*,$@,${!#}

s# 用來統計命令行的參數個數

s* 用來訪問所有的命令行參數,並且構成一個字符串整體輸出

s@ 同s*,只是結果是分散成字符串數組,每個數組中的元素都是一個參數

${!#} 代表的最後一個參數,因為花括號中不可以用$,因此用!來代替它

技術分享圖片
 1 [Hermioner@localhost Documents]$ cat testfile
 2 #!/bin/bash
 3 echo the "\$*" is  $*
 4 echo the "\$@" is $@
 5 echo the "\$#" is $#
 6 echo the "\${!#}" is ${!#}
 7 
 8 [Hermioner@localhost Documents]$ bash testfile a b c d
 9 the $* is a b c d
10 the $@ is a b c d
11 the $# is 4
12 the ${!#} is d
View Code 技術分享圖片
 1 [Hermioner@localhost Documents]$ cat testfile
 2 #!/bin/bash
 3 echo
 4 count=1
 5 for param in "$*"
 6 do 
 7    echo "\$* Parameter #$count = $param"
 8    count=$[ $count+1 ]
 9 done
10 
11 echo
12 count=1
13 for param in "$@"
14 do
15    echo "\$@ Parameter #$count = $param"
16    count=$[ $count+1 ]
17 done
18 
19 [Hermioner@localhost Documents]$ bash testfile a b c d
20 
21 $* Parameter #1 = a b c d
22 
23 $@ Parameter #1 = a
24 $@ Parameter #2 = b
25 $@ Parameter #3 = c
26 $@ Parameter #4 = d
27 [Hermioner@localhost Documents]$ 
View Code

3. shift 移動變量

shift可以用來在不知道有多少參數,以及每個參數的值的情況下進行遍歷,因為它始終可以只打印第一個值。默認情況下它會將每個參數變量向左移動一個位置。所以變量$3的值會移動到$2中,$2的值會移動到$1中,而變量$1的值則會被刪除(note:$0代表程序嗎,不會改變)

也可以shift n 來指定左移動多少個,eg: shift 2 ,則$3的會移動到$1中,這樣就可以跳過一些值不遍歷了。

技術分享圖片
1 [Hermioner@localhost Documents]$ cat test3.sh
2 #!/bin/bash
3 echo "the original parameters is $*"
4 shift 2
5 echo "the new first parameter is $1"
6 [Hermioner@localhost Documents]$ bash test3.sh 1 2 3 4 5
7 the original parameters is 1 2 3 4 5
8 the new first parameter is 3
9 [Hermioner@localhost Documents]$
View Code

note:配合shift的使用,同樣可以通過shell腳本中的邏輯來判斷是選項還是參數,從而讓參數得到應有的輸出。並在在bash shell中還提供了getopt和getopts來判斷是選項還是參數-------用時參考它們用法即可。

4. 獲取用戶輸入-------交互性更強,類似java中的scanner+system.in用法

采用read命令。read後面跟變量名,就可以將輸入的值保存到變量中;如果不輸入變量名,那麽就自動保存在了特殊環境變量REPLY中。

技術分享圖片
1 [Hermioner@localhost Documents]$ cat test1
2 #!bin/bash
3 echo -n "Enter your name:"
4 read name
5 echo "hello $name"
6 [Hermioner@localhost Documents]$ bash test1
7 Enter your name:Tom
8 hello Tom
9 [Hermioner@localhost Documents]$ 
View Code

note1:如果用戶一直不輸入,read會一直等待,因此可以設置計時器,用-t選項。時間過了,就不等了。

eg:read -t 5 name

note2: 類似密碼輸入,隱藏方式讀取,只需要添加 -s就可以

note3: 還可以從文件中讀取,一行一行的讀取

技術分享圖片
 1 [Hermioner@localhost Documents]$ cat test1
 2 #!bin/bash
 3 a
 4 b
 5 c
 6 [Hermioner@localhost Documents]$ cat test2
 7 #!/bin/bash
 8 cat test1 | while read line    #采用了管道
 9 do
10     echo "the line is $line"
11 done
12 echo "read is done"
13 [Hermioner@localhost Documents]$ bash test2
14 the line is #!bin/bash
15 the line is a
16 the line is b
17 the line is c
18 read is done
19 [Hermioner@localhost Documents]$ 
View Code

補充管道:

command1 | command2 就是將命令1的輸出重定向到了command2中。 可以多級重定向,多添加|就好了。

參考文獻

Linux命令行與shell腳本編程大全(第3版)[美] 布魯姆(Richard Blum),布雷斯納漢(Christine Bresnahan) 著,門佳,武海峰 譯

shell基礎05 處理用戶輸入