从ARGV访问变量

时间:2010-05-06 11:29:43

标签: linux bash shell arguments

如果您不熟悉创建新帐户后运行的脚本,我正在编写一个cPanel post.net脚本。它依赖于传递给脚本的用户帐户变量,然后我将其用于各种事物(创建数据库等)。但是,我似乎无法找到正确的方法来访问我想要的变量。我对shell脚本不太好,所以我很欣赏一些建议。我曾经读过某个地方,我想要的价值将包含在$ ARGV {'user'}中,​​但这只是给出“root”而不是我需要的值。我已经尝试循环遍历所有参数(list of arguments here),如下所示:

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

我想要的价值在那里,我只是不确定如何准确地定位它。有关使用PHP或Perl执行此操作的信息here,但我必须将其作为shell脚本执行此操作。

编辑理想情况下,我希望能够通过$ 1或$ 2之外的其他内容调用变量,因为如果添加或删除参数会产生问题

..例如在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’];

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

参数将传递到您的脚本as a hash

/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 :(得分:1)

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

答案 2 :(得分:1)

为什么不用

之类的东西开始编写脚本
ARG_USER=$1
ARG_FOO=$2
ARG_BAR=$3

然后在您的脚本中,请参考$ARG_USER$ARG_FOO$ARG_BAR,而不是$1$2$3。这样,如果您决定更改参数的顺序,或者在最后的某处插入新参数,则代码中只有一个位置需要更新参数顺序和参数含义之间的关联。

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

答案 3 :(得分:0)

您可以执行以下操作:

#!/bin/bash

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

然后,将脚本调用为:

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