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

附言: 我当然可以在佩尔完成所有的工作,但我正在努力学习这种方式,因为它可以帮助我在其他情况下。

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

只有你的档案。

在这个例子中,我使用了文件/etc/password,使用了特殊的变量 ${RANDOM}(我在这里学到的)和您使用的 sed表达式,唯一的区别是我使用了双引号而不是单引号来允许变量展开。

你可能在找 eval $var

你只需要做:

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

根据巴斯的帮助:

~$ 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.

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

更好的方法

使用函数:

# define it
myls() {
ls -l "/tmp/test/my dir"
}


# run it
myls

使用数组:

# define the array
mycmd=(ls -l "/tmp/test/my dir")


# run the command
"${mycmd[@]}"

在 shell 脚本中执行字符串命令有两种基本方法,不管它是否作为参数给出。

COMMAND="ls -lah"
$(echo $COMMAND)

或者

COMMAND="ls -lah"
bash -c $COMMAND
cmd="ls -atr ${HOME} | tail -1" <br/>
echo "$cmd"  <br/>
VAR_FIRST_FILE=$( eval "${cmd}" )  <br/>

或者

cmd=("ls -atr ${HOME} | tail -1")  <br/>
echo "$cmd"  <br/>
VAR_FIRST_FILE=$( eval "${cmd[@]}" )