2010-05-06 151 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变量,如果并不总是每次都以相同的顺序指定所有的变量。