【问题标题】:Accessing variable from ARGV从 ARGV 访问变量
【发布时间】:2011-02-16 08:44:46
【问题描述】:

我正在编写一个 cPanel postwwwact 脚本,如果您不熟悉该脚本,它会在创建新帐户后运行。它依赖于传递给脚本的用户帐户变量,然后我将其用于各种事情(创建数据库等)。但是,我似乎找不到访问我想要的变量的正确方法。我对 shell 脚本不是很好,所以我很感激一些建议。我在某处读到我想要的值将包含在 $ARGV{'user'} 中,但这只是给出了“root”而不是我需要的值。我试过像这样循环所有参数(list of arguments here):

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

我想要的价值就在那里,我只是不确定如何准确定位它。 here 有关于使用 PHP 或 Perl 执行此操作的信息,但我必须将其作为 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’];

有什么想法吗?

【问题讨论】:

    标签: linux bash shell arguments


    【解决方案1】:

    参数被传递给你的脚本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
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        您可以执行以下操作:

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

        然后,调用脚本:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 我不喜欢这个,如果添加或删除参数会发生什么
          猜你喜欢
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 2010-11-25
          • 2019-10-13
          • 2023-03-18
          • 2018-06-28
          • 1970-01-01
          相关资源
          最近更新 更多