Bash脚本-可变内容作为命令运行


159

我有一个Perl脚本,该脚本为我提供了一个定义的列表随机数,这些随机数与文件的行相对应。接下来,我想使用从文件中提取这些行sed

#!/bin/bash
count=$(cat last_queries.txt | wc -l)
var=$(perl test.pl test2 $count)

变量var返回的输出类似:cat last_queries.txt | sed -n '12p;500p;700p'。问题是我无法运行最后一条命令。我尝试使用$var,但是输出不正确(如果我手动运行该命令,它运行正常,因此没有问题)。正确的方法是什么?

PS:当然,我可以在Perl中完成所有工作,但是我正在尝试以此方式学习,因为它可以在其他情况下帮助我。

Answers:


215

您只需要执行以下操作:

#!/bin/bash
count=$(cat last_queries.txt | wc -l)
$(perl test.pl test2 $count)

但是,如果您想稍后再调用Perl命令,这就是为什么要将其分配给变量的原因,那么:

#!/bin/bash
count=$(cat last_queries.txt | wc -l)
var="perl test.pl test2 $count" # You need double quotes to get your $count value substituted.

...stuff...

eval $var

根据Bash的帮助:

~$ help eval
eval: eval [arg ...]
    Execute arguments as a shell command.

    Combine ARGs into a single string, use the result as input to the shell,
    and execute the resulting commands.

    Exit Status:
    Returns exit status of command or success if command is null.


2
line=$((${RANDOM} % $(wc -l < /etc/passwd)))
sed -n "${line}p" /etc/passwd

仅与您的文件相反。

在此示例中,我使用了文件/ etc / password,并使用了特殊变量${RANDOM}(我在此处了解了有关信息)以及sed您所拥有的表达式,唯一的不同是,我使用双引号而不是单引号来允许变量扩展。


2

在这种情况下,你必须包含参数的命令,你正在运行,而不仅仅是一个单一的字符串,你应该多变量不能 EVAL直接使用,因为它会在以下情况下会失败:

function echo_arguments() {
  echo "Argument 1: $1"
  echo "Argument 2: $2"
  echo "Argument 3: $3"
  echo "Argument 4: $4"
}

# Note we are passing 3 arguments to `echo_arguments`, not 4
eval echo_arguments arg1 arg2 "Some arg"

结果:

Argument 1: arg1
Argument 2: arg2
Argument 3: Some
Argument 4: arg

请注意,即使将“ Some arg”作为单个参数传递,也eval应将其读取为两个。

相反,您可以只使用字符串作为命令本身:

# The regular bash eval works by jamming all its arguments into a string then
# evaluating the string. This function treats its arguments as individual
# arguments to be passed to the command being run.
function eval_command() {
  "$@";
}

请注意eval和的输出之间的区别eval_command

eval_command echo_arguments arg1 arg2 "Some arg"

结果:

Argument 1: arg1
Argument 2: arg2
Argument 3: Some arg
Argument 4:

1
为了避免在空格之后对每个元素进行求值,如在您的第一个示例中使用eval一样,请用单引号将其引起来: eval 'echo_arguments arg1 arg2 "Some arg"'。然后输出将与您的第二个示例相同。
诺姆·马诺斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.