8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何在 heredoc 部分中设置和扩展变量

onlyf 2月前

46 0

我有一个 heredoc,需要从主脚本调用现有变量,并设置自己的变量以供稍后使用。类似这样的内容:count=0ssh $other_host <

我有一个 heredoc,需要从主脚本调用现有变量,设置自己的变量以供稍后使用。如下所示:

count=0

ssh $other_host <<ENDSSH
  if [[ "${count}" == "0" ]]; then
    output="string1"
  else
    output="string2"
  fi
  echo output
ENDSSH

这不起作用,因为“输出”没有设置任何东西。

我尝试使用这个问题的解决方案:

count=0

ssh $other_host << \ENDSSH
  if [[ "${count}" == "0" ]]; then
    output="string1"
  else
    output="string2"
  fi
  echo output
ENDSSH

它也不起作用。$output 被设置为 \'string2\',因为 $count 没有扩展。

如何使用 heredoc 来扩展父脚本中的变量设置其自己的变量?

帖子版权声明 1、本帖标题:如何在 heredoc 部分中设置和扩展变量
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由onlyf在本站《bash》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 没有 \'heredoc 执行\'。heredoc 定义一个字符串。该字符串被传递给 ssh,在那里由 shell 进行评估。

  • 您可以使用:

    count=0
    
    ssh -t -t "$other_host" << ENDSSH
      if [[ "${count}" == "0" ]]; then
        output="string1"
      else
        output="string2"
      fi
      echo "\$output"
      exit
    ENDSSH
    

    我们使用 \$output 它以便在远程主机上而不是本地扩展。

  • 最好 better not to use stdin (例如使用 here-docs)将命令传递给 ssh .

    如果你使用 命令行参数 来传递 shell 命令,则可以更好地区分本地扩展的内容和远程执行的内容:

    # Use a *literal* here-doc to read the script into a *variable*, $script.
    # Note how the script references parameter $1 instead of local variable $count.
    read -d '' -r script <<'EOF'
      [[ $1 == '0' ]] && output='zero' || output='nonzero'
      echo "$output"
    EOF
    
    # The variable whose value to pass as an argument.
    # With value 0, the script will echo 'zero', otherwise 'nonzero'.
    count=0
    
    # Use `set -- '$<local-var>'...;` to pass the local variables as
    # positional arguments, followed by the script code.
    ssh localhost "set -- '$count'; $script"
    
  • 您可以按照@anubhava 所说转义变量,或者,如果您获得的变量太多而无法转义,则可以分两步进行:

    # prepare the part which should not be expanded
    # note the quoted 'EOF'
    read -r -d '' commands <<'EOF'
    if [[ "$count" == "0" ]]; then
        echo "$count - $HOME"
    else
        echo "$count - $PATH"
    fi
    EOF
    
    localcount=1
    #use the unquoted ENDSSH
    ssh [email protected] <<ENDSSH
    count=$localcount # count=1
    #here will be inserted the above prepared commands
    $commands 
    ENDSSH
    

    将会打印类似这样的内容:

    1 - /usr/bin:/bin:/usr/sbin:/sbin
    
返回
作者最近主题: