Bash Script - 将变量内容作为要运行的命令

时间:2011-05-13 21:40:00

标签: bash

我有一个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,但输出不正确(如果我手动运行命令它工作正常,那么没有问题)。这样做的正确方法是什么?

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

4 个答案:

答案 0 :(得分:184)

如果我理解正确,你只需要这样做(对不起,如果我错过了你的观点):

#!/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.

答案 1 :(得分:159)

您可能正在寻找eval $var

答案 2 :(得分:2)

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

只需使用您的文件。

在这个例子中,我使用文件/ etc / password,使用特殊变量${RANDOM}(我在这里学到的)和你所拥有的sed表达式,唯一不同的是我正在使用双引号而不是单引号以允许变量扩展。

答案 3 :(得分:0)

如果你有多个变量包含你正在运行的命令的参数,而不只是一个字符串,你应该直接使用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

请注意,即使&#34;有些arg&#34;作为单个参数传递,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: