阅读了bash手册页和关于这篇文章.
我仍然无法理解eval命令究竟是什么以及它的典型用途.例如,如果我们这样做:
bash$ set -- one two three # sets $1 $2 $3
bash$ echo $1
one
bash$ n=1
bash$ echo ${$n} ## First attempt to echo $1 using brackets fails
bash: ${$n}: bad substitution
bash$ echo $($n) ## Second attempt to echo $1 using parentheses fails
bash: 1: command not found
bash$ eval echo \${$n} ## Third attempt to echo $1 using 'eval' succeeds
one
Run Code Online (Sandbox Code Playgroud)
这里究竟发生了什么,美元符号和反斜杠如何与问题相关联?
我试图在perl cmd执行块中重用脚本中稍后在bash脚本中定义的shell函数.对匹配一个正则表达式(捕获组#2)后,对perl cmd的调用基本上需要运行定义的shell函数.请参阅下面的代码定义
bash shell脚本中的相关函数定义:
evalPS() {
PS_ARGS=$(eval 'echo -en "'${1}'"' | sed -e 's#\\\[##g' -e 's#\\\]##g')
PS_STR=$((set +x; (PS4="+.$PS_ARGS"; set -x; :) 2>&1) | cut -d':' -f1 | cut -d'.' -f2)
echo -en "${PS_STR}"
}
Run Code Online (Sandbox Code Playgroud)
上面的定义使用一些bashisms和hacks来评估用户对字符串的真实提示.
需要在下一个函数中在perl中调用该函数:
remPS() {
# store evalPS definition
EVALPS_SOURCE=$(declare -f evalPS)
# initalize prompt
eval "$PROMPT_COMMAND" &> /dev/null
# handle args
( [[ $# -eq 0 ]] && cat - || cat "${1}" ) |
# …Run Code Online (Sandbox Code Playgroud) 我有一个运行的脚本,运行后它有一些信息需要传递给下一个要运行的脚本.
Unix/DOS命令是这样的:
perl -x -s param_send.pl
perl -x -s param_receive.plRun Code Online (Sandbox Code Playgroud)
param_send.pl是:
# Send param
my $send_var = "This is a variable in param_send.pl...\n";
$ARGV[0] = $send_var;
print "Argument: $ARGV[0]\n";Run Code Online (Sandbox Code Playgroud)
param_receive.pl是:
# Receive param
my $receive_var = $ARGV[0];
print "Parameter received: $receive_var";Run Code Online (Sandbox Code Playgroud)
但没有任何印刷品.我知道我做错了但是从教程中我无法弄清楚如何将一个参数从一个脚本传递给下一个脚本!
提前谢谢了.
bash ×2
perl ×2
shell ×2
command-line ×1
eval ×1
function ×1
linux ×1
parameters ×1
regex ×1
scripting ×1