从ARGV访问variables

我正在编写一个cPanel postwwwact脚本,如果您不熟悉在新帐户创build后运行的脚本。 它依赖于用户帐户variables被传递到脚本,然后我用于各种事情(创build数据库等)。 但是,我似乎无法find正确的方式来访问我想要的variables。 我用shell脚本不太好,所以我会很感激一些build议。 我曾经在某处读过我想要的价值会包含在$ ARGV {'user'}中,​​但是这只是给我“根”,而不是我需要的价值。 我试过循环所有参数( 这里是参数列表 ),如下所示:

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

我想要的价值在那里,我只是不知道如何准确的目标。 有关PHP或Perl这样做的信息,但我必须做一个shell脚本。

编辑理想情况下,我想能够通过除$ 1或$ 2等以外的东西来调用该variables,因为如果添加或删除参数,这会产生问题

..例如在这里的PHP代码:

 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']; 

有任何想法吗?

参数作为散列传递给脚本:

 /scripts/$hookname user $user password $password 

您可以在Bash 4中使用关联数组,或者在早期版本的Bash中使用建立的变量名称。

 #!/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来遍历参数,但是它是破坏性的,上面的方法将$@$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 

如果它作为命令行参数传递给脚本,则可以使用$1如果它是第一个参数), $2如果是第一个参数),依此类推。

为什么不从类似的东西开始你的脚本

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

然后在你的脚本中引用$ARG_USER$ARG_FOO$ARG_BAR而不是$1$2$3 。 这样,如果你决定改变参数的顺序,或者在最后插入一个新的参数,你的代码中只有一个地方需要更新参数顺序和参数含义之间的关联。

你甚至可以对$*进行更复杂的处理来设置你的$ARG_WHATEVER变量,如果它不总是每次都以相同的顺序指定的话。

您可以执行以下操作:

 #!/bin/bash for var in $argv; do <do whatver you want with $var> done 

然后,调用脚本:

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