如果您不熟悉创建新帐户后运行的脚本,我正在编写一个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’];
有什么想法吗?
答案 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