Linux shel程式設計之命令列引數處理

2021-07-26 14:09:07 字數 3757 閱讀 8659

在執行指令碼程式中,使用者可以通過命令列引數將引數傳遞給指令碼程式:

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