在執行指令碼程式中,使用者可以通過命令列引數將引數傳遞給指令碼程式:
# ./test 10 a
通過一些特殊的變數:位置引數,可以在指令碼中取得命令列引數。其中,$0為程式名稱,$1為第乙個引數,$2為第二個引數,依此類推 $9為第九個引數。
# cat test.sh
#!/bin/bash
echo "shell name is $0"
echo "first args is $1"
echo "second args is $2"
# ./test.sh
shell name is ./test.sh
first args is
second args is
# ./test.sh 1 2
shell name is ./test.sh
first args is 1
second args is 2
在第一次執行./test.sh時,沒有傳入引數,可以看出$1,$2值為空。
每個引數都是通過空格分隔的,如果輸入的引數中包含空格,要用引號(" "或' 『)包起來。
# ./test.sh "hello world!" 2
shell name is ./test.sh
first args is hello world!
second args is 2
如果命令列引數多於9個,如果想取得後面的引數,使用$,$..,$(n)取得。
雖然我們可以通過$0確定程式的名稱,但是$0中包括程式完整的路徑。
# cat test.sh
#!/bin/bash
echo "shell name is $0"
# ./test.sh
shell name is ./test.sh
# /home/jie/code/shellcode/test.sh
shell name is /home/jie/code/shellcode/test.sh
有時候我們僅僅想獲得程式的名稱(不包括具體路徑),可以使用basename命令取得程式名稱(name=`basename $0`)。
# cat test.sh
#!/bin/bash
name=`basename $0`
echo "shell name is $name"
# ./test.sh
shell name is test.sh
# /home/jie/code/shellcode/test.sh
shell name is test.sh
在使用shell指令碼中的命令列引數之前,必須對引數進行檢查,以保證命令列引數中確實包含我們想要的資料。
$ cat test.sh
#!/bin/bash
if [ -n "$1" ]
then
echo "hello $1!"
else
echo "please input a name!"
fi$ ./test.sh mike
hello mike!
$ ./test.sh
please input a name!
2、特殊的引數變數
在bash shell中有一些特殊的引數變數,用於跟蹤命令列引數。
(1)命令列引數個數
變數$#記錄了指令碼啟動時的命令列引數的個數。
# cat test.sh
#!/bin/bash
echo "the count of args is : $#"
# ./test.sh 1 2 3 4
the count of args is : 4
# ./test.sh 1 2 3 4 5 6 "hello"
the count of args is : 7
(2)命令列所有引數
變數$*和$@包含了全部命令列引數(不包括程式名稱$0),變數$*將命令列的所有引數作為乙個整體處理。而$@將所有引數當作同乙個字串的多個單詞處理,允許對其中的值進行迭代。
# cat test.sh
#!/bin/bash
echo "using the \$* method:$*"
echo "using the \$@ method:$@"
# ./test.sh 1 2 3
using the $* method:1 2 3
using the $@ method:1 2 3
下面這個例子展示了$*和$@的不同之處
# cat test.sh
#!/bin/bash
count=1
for param in "$*"
do echo "\$* parameter #$count = $param"
count=$[$count+1]
done
count=1
for param in "$@"
do echo "\$@ parameter #$count = $param"
count=$[$count+1]
done
# ./test.sh 1 2 3
$* parameter #1 = 1 2 3
$@ parameter #1 = 1
$@ parameter #2 = 2
$@ parameter #3 = 3
3、命令列引數移位
bash shell提供shift命令幫助操作命令行引數,shift命令可以改變命令列引數的相對位置,預設將每個引數左移乙個位置,$3的值移給$2,$2的值移給$1,$1的值被丟棄。
注意:$0的值和位置不受shift命令影響。$1移掉後,該引數值就丟失了,不能恢復。
# cat test.sh
#!/bin/bash
count=1
while [ -n "$1" ]
do echo "parameter #$count = $1"
count=$[$count+1]
shift
done
echo "\$#=$#"
echo "\$*=$*"
echo "\$@=$@"
echo "\$1=$1"
# ./test.sh 1 2 3
parameter #1 = 1
parameter #2 = 2
parameter #3 = 3
$#=0
$*=$@=
$1=
shift命令可以帶乙個引數實現多位移變化,命令列引數向左多個位置。
# cat test.sh
#!/bin/bash
echo "the origin parameters are:$*"
shift 2
echo "after shift 2 the parameters are:$*"
# ./test.sh 1 2 3 4 5
the origin parameters are:1 2 3 4 5
after shift 2 the parameters are:3 4 5
unix高階程式設計之 命令列引數(實踐一)
1 atexit 函式 格式 include int atexit void func void 其中,atexit函式的引數是乙個函式位址,當呼叫此函式時無需向他傳遞任何引數,也不期望他返回乙個值。exit呼叫這些函式的順序與他們登記時候的順序相反。同一函式如若登記多次,則也會被呼叫多次。2 例項...
命令列程式設計問題集
本文就做為遇到的問題集合吧!2008.10.08 1.注釋裡面不能有 等,如果要用特殊字元注釋的話也需要在前面加 2.習慣了寫 echo off,然後苦惱除錯怎麼這麼難,其實,把這句去掉就方便除錯了 2008.10.09 3.for裡面不能設定變數。如果for迴圈層多了 複雜了,就想著先用變數存著,...
shell程式設計 命令列引數
1 獲取第1個引數 2 獲取第2個引數 獲取第10個引數 test.sh 2 3 test.sh 指令碼內容 var1 1 2 var2 2 3 var3 var1 var2 echo var3 6獲取超過第9個引數時要用花括號括起來,0 獲取當前檔案的指令碼名稱包括路徑 test.sh filep...