泛型"header"和"footer",原封不动地包含在脚本中以实现多行语句



要将追逐的方法切成点,以下(起源于查尔斯·达菲(Charles Duffy(对相关问题的答复 - 请参阅他的答案(是我要求的一种可接受格式:

eval "$(
  { sed -E -e 's/^[ ]+//;' -e ':a;N;$!ba;s/n//g' | tr -d 'n'; } <<'____COMMAND'
sshfs 
foo_user@fooserver.com:/sftp_folder 
  /var/sshfs.sandbox/server.com 
  -o 
    user=foo_user
    ,reconnect
    ,ServerAliveInterval=15
    ,ServerAliveCountMax=3
____COMMAND
)"

请注意,我试图将命令分为多线时有一个尾随空间:

sshfs 
foo_user@fooserver.com:/sftp_folder 
  /var/sshfs.sandbox/server.com 
  -o 

且没有尾随空间,对于必须在没有介入空白的情况下进行连接的选项:

user=foo_user
,reconnect
,ServerAliveInterval=15
,ServerAliveCountMax=3

串联后,命令变为:

sshfs foo_user@fooserver.com:/sftp_folder /var/sshfs.sandbox/server.com -o user=foo_user,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3

但是,我被告知尾随空间是一个坏主意(再次,请参阅查尔斯·达菲(Charles Duffy(的动机答复(

因此,我想知道。有没有办法实现这三个:

  1. 将声明全部保持"在一起"。
  2. 没有落后的空间。
  3. 使"标题"one_answers"页脚"修复并在没有修改的其他脚本中复制粘贴。

我正在考虑使用拖延倾斜并修改解析表达式:

{ sed -E -e 's/^[ ]+//;' -e ':a;N;$!ba;s/n//g' | tr -d 'n'; }

以便我可以实现上面提到的所有三个。

您是否考虑过使用带有反弹的多行命令?这使得尾随空间清晰可见。

来自Bash手册:

3.1.2.1逃脱字符

非引用的后斜线''是bash逃生角色。它保留了 接下来的下一个角色的字面价值, 新线例外。如果出现 newline对,而后斜线 本身没有引用, newline被视为一条线延续 (也就是说,它被从输入流中删除,有效地将其删除 忽略(。

sshfs 
foo_user@fooserver.com:/sftp_folder 
/var/sshfs.sandbox/server.com 
-o 
user=foo_user
,reconnect
,ServerAliveInterval=15
,ServerAliveCountMax=3,

Backslash/Newline Trick是命令正常解析的一部分,除了忽略Newlines外,别无其他效果,因此您可以按照通常的方式使用引号。

也许在表达命令本身方面较少干净,但不需要此处的文档或对sed的额外调用。

这就是说,Charlesduffy建议回答您的原始问题的基于数组的解决方案,从我的经验中,将命令和论点放在数组中是对许多头痛的简单有效的解决方案。有原因您不想使用此方法吗?

希望这将做您想要的。

首先,定义旨在解析标准输入收到的命令的函数。

#!/bin/bash
execute_command()
{
  local -a command=()
  local arg=
  while IFS= read -r line
  do
    [[ $line =~ [[:blank:]]*(.*[^[:blank:]\])(\?)[[:blank:]]*$ ]]
    if
      [[ ${BASH_REMATCH[2]} ]]
    then
      arg+=${BASH_REMATCH[1]}
    else
      command+=("$arg${BASH_REMATCH[1]}")
      arg=
    fi
  done
  "${command[@]}"
}

然后,通过在每行的末端留下尾随的斜线来调用此功能,您希望以下行被视为同一参数的一部分。上面的代码不会执行任何解析,因此您不能在同一行上放两个论点(在您的示例中,您没有这样做,因此我认为对您来说是一个可接受的限制(。

execute_command <<'____COMMAND'
sshfs
foo_user@fooserver.com:/sftp_folder
  /var/sshfs.sandbox/server.com
  -o
    user=foo_user
    ,reconnect
    ,ServerAliveInterval=15
    ,ServerAliveCountMax=3
____COMMAND

这为您提供了一个非常简单,可重复使用的"标头",不需要(但可以容忍(落后空间,并允许所有线路上的领先空间,同时引入尽可能少的重/怪异语法。

相关内容

  • 没有找到相关文章

最新更新