Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 计算字符串中的变量_Bash - Fatal编程技术网

Bash 计算字符串中的变量

Bash 计算字符串中的变量,bash,Bash,此脚本中的最后一行无法按预期工作: myfile="afile.txt" mycmd='cat $myfile' eval $mycmd echo eval $mycmd 这里echo打印“eval cat$myfile”。如何打印“eval cat afile.txt”?您需要评估回声,而不是相反的方式: eval echo "eval $mycmd" 或 我认为前者更可取,但至少引用变量展开式。您可以写: eval echo eval $mycmd 或者更健壮一点: eval echo

此脚本中的最后一行无法按预期工作:

myfile="afile.txt"
mycmd='cat $myfile'
eval $mycmd
echo eval $mycmd

这里echo打印“eval cat$myfile”。如何打印“eval cat afile.txt”?

您需要评估回声,而不是相反的方式:

eval echo "eval $mycmd"

我认为前者更可取,但至少引用变量展开式。

您可以写:

eval echo eval $mycmd
或者更健壮一点:

eval echo eval "$mycmd"

也就是说,我建议尽可能避免
eval
;它往往非常脆弱,因为Bash命令行处理中有许多复杂的步骤,而使用
eval
通常意味着您将多次执行这些步骤。很难跟踪实际情况。

如果使用bash,更好的方法是使用数组:

myfile="afile.txt"
mycmd=(cat "$myfile")
echo "${mycmd[@]}"
"${mycmd[@]}"

让我们一步一步来:

执行此操作时:

mycmd='cat $myfile'
您可以防止shell插入
$myfile
。因此:

$ echo $mycmd
cat $myfile
如果要允许插值,可以使用双引号:

$ mycmd="echo $myfile"  #Double quotes!
$ echo "$mycmd"
cat afile.txt
当然,这会在执行
评估时冻结对
$mycmd
的解释

$ myfile="afile.txt"
$ mycmd="echo $myfile"
$ echo $mycmd
cat afile.txt
$ eval $mycmd   #Prints out afile.txt
$ myfile=bfile.txt
$ eval $mycmd   #Still prints out afile.txt and not bfile.txt
将此与:

$ myfile="afile.txt"
$ mycmd='cat $myfile'   #Single quotes hide $myfile from the shell
echo $mycmd
cat $myfile             #Shell didn't change "$myfile", so it prints as a literal
$ eval $mycmd           #Prints out afile.txt
$ myfile=bfile.txt
$ eval $mycmd           #Now prints out bfile.txt
您可能要做的是在回显echo语句时计算echo语句中的
$mycmd

$ echo $(eval "echo $mycmd")
$ cat afile.txt
$ myfile=bfile.txt
$ echo $(eval "echo $mycmd")
cat bfile.txt

这不适用于:grep fatal`find/var/log/-name'current'
$ echo $(eval "echo $mycmd")
$ cat afile.txt
$ myfile=bfile.txt
$ echo $(eval "echo $mycmd")
cat bfile.txt