2010-05-06 70 views
2

我正在編寫一個cPanel postwwwact腳本,如果您不熟悉創建新帳戶後運行的腳本。它依賴於將用戶帳戶變量傳遞給我然後用於各種事情(創建數據庫等)的腳本。但是,我似乎無法找到正確的方式來訪問我想要的變量。我對shell腳本不太好,所以我會很感激一些建議。我曾經在某處讀過我想要的價值會包含在$ ARGV {'user'}中,​​但這只是給出了「根」,而不是我需要的價值。我試着通過循環所有參數(list of arguments here)是這樣的:從ARGV訪問變量

#!/bin/sh 
for var 
do 
    touch /root/testvars/$var 
done 

,我希望值是在那裏,我只是不知道如何準確地瞄準它。有關於使用PHP或Perl進行此操作的信息here,但我必須將其作爲shell腳本執行此操作。

編輯我非常希望能夠通過超過$ 1或$ 2等其他的東西來調用變量,因爲這會造成問題,如果一個參數是在PHP代碼中添加或刪除

..for例子這裏:

function argv2array ($argv) { 
     $opts = array(); 
     $argv0 = array_shift($argv); 

     while(count($argv)) { 
       $key = array_shift($argv); 
       $value = array_shift($argv); 
       $opts[$key] = $value; 
     } 
     return $opts; 
} 
// allows you to do the following: 
$opts = argv2array($argv); 
echo $opts[‘user’]; 

任何想法?

回答

2

的參數傳遞給腳本as a hash

/scripts/$hookname user $user password $password 

可以在擊4,或在早期版本中,你可以使用內置了變量名猛砸的使用關聯數組。

#!/bin/bash 
# Bash >= 4 
declare -A argv 
for ((i=1;i<=${#@};i+=2)) 
do 
    argv[${@:i:1}]="${@:$((i+1)):1}" 
done 
echo ${argv['user']} 

或者

#!/bin/bash 
# Bash < 4 
for ((i=1;i<=${#@};i+=2)) 
do 
    declare ARGV${@:i:1}="${@:$((i+1)):1}" 
done 
echo ${!ARGV*} # outputs all variable names that begin with ARGV 
echo $ARGVuser 

運行的是:

$ ./argvtest user dennis password secret 
dennis 

注意:您還可以使用shift步驟通過爭論,但它的破壞性和上述方法離開[email protected]$1$2等)。

#!/bin/bash 
# Bash < 4 
# using shift (can use in Bash 4, also) 
for ((i=1;i<=${#@}+2;i++)) 
do 
    declare ARGV$1="$2" 
    # Bash 4: argv[$1}]="$2" 
    shift 2 
done 
echo ${!ARGV*} 
echo $ARGVuser 
+0

Bash <4腳本很好用,謝謝! – robjmills 2010-05-06 13:17:13

1

如果它作爲命令行參數傳遞給腳本,那麼如果它是第一個參數,則爲$1,如果是第二個參數,則爲$2,依此類推。

+0

我不喜歡這個,如果添加或刪除參數會發生什麼 – robjmills 2010-05-06 11:43:09

0

你可以做到以下幾點:

#!/bin/bash 

for var in $argv; do 
    <do whatver you want with $var> 
done 

,然後調用腳本:

$ /path/to/script param1 arg2 item3 item4 etc 
1

爲什麼不開始與一些腳本像

ARG_USER=$1 
ARG_FOO=$2 
ARG_BAR=$3 

然後稍後在您的腳本中提及$ARG_USER,$ARG_FOO$ARG_BAR而不是$1,$2$3。這樣,如果您決定更改參數的順序,或者在最後插入一個新的參數,則代碼中只有一個地方需要更新參數順序和參數含義之間的關聯。

你甚至可以做更復雜的處理$*來設置你的$ARG_WHATEVER變量,如果並不總是每次都以相同的順序指定所有的變量。