Bash脚本 – 将variables内容作为命令运行

我有一个Perl脚本,给我一个定义的列表随机数对应于文件的行。 接下来我想要使用sed从文件中提取这些行。

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

variablesvar返回如下输出: cat last_queries.txt | sed -n '12p;500p;700p' cat last_queries.txt | sed -n '12p;500p;700p' 。 问题是我不能运行这最后一个命令。 我尝试使用$var但输出是不正确的(如果我手动运行命令,它工作正常,所以没有问题)。 什么是正确的方法来做到这一点?

PS:当然,我可以用Perl做所有的工作,但是我正在努力学习,因为它可以在其他情况下帮助我。

如果我正确理解你,你只需要做(抱歉,如果我错过了你的观点):

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

但是如果你想稍后调用你的perl命令,那就是为什么你想把它分配给一个variables,那么:

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

你可能正在寻找eval $var

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

只是用你的文件来代替。

在这个例子中,我使用文件/ etc / password,使用特殊variables${RANDOM} (我在这里学到的)和sedexpression式,唯一不同的是我使用双引号而不是单引号来允许可变扩展。

如果有多个variables包含您正在运行的命令的参数,而不是单个string,则不应直接使用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 

请注意,尽pipe“Some arg”作为单个parameter passing, eval将其作为两个参数读取。

相反,你可以使用string作为命令本身:

 # 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: