bash 命令行 - 如何将 sh -c 的多行转换为单行

bash 命令行 - 如何将 sh -c 的多行转换为单行

在 OSX 命令行中,我有一些逻辑如下。

for i in {1..10}
do
   for j in {1..10}
   do
       echo "test inner"
   done;
   echo "test outer"
done

它运行良好。但我想从 运行它nohup。所以我需要将上面组合成一行以适应nohup sh -c "{a single line}"

但是,下面的行给出了错误。它只是跳过了上面的所有换行符。

sh -c 'for i in {1..10} do for j in {1..10} do echo "test inner" done; echo "test outer" done'

错误:

sh: -c: line 0: syntax error near unexpected token `echo'
sh: -c: line 0: `for i in {1..10} do for j in {1..10} do echo "test inner" done; echo "test outer" done'

编辑:

我不想将其作为文件运行,因为该命令的凭据受到了轻微的保护。我能想到的最简单的方法是将其作为命令运行,这样它就不会在共享虚拟机上留下文件。我不知道这对凭据的保护效果如何,或者是否有更好的方法。欢迎更多建议/想法。

编辑:

使用 bash 和单引号使其工作。 (基于Tigger的回答)

bash -c 'for i in {1..10}; do for j in {1..10}; do echo "test inner"; done; echo "test outer"; done;'

答案1

我认为你有两个选择:

  1. 将其放入脚本文件并运行
  2. 用分号替换上面较大代码窗口中的每个换行符

我个人会选择1。

答案2

参数中包含换行符没有问题sh -c{1..10}zsh语法(现在被其他一些 shell 支持),而不是sh.如果您sh输出除{1..20}on以外的任何内容echo {1..20},则这是 POSIX 一致性违规,您应该准备好在新版本中修复它。您可以使用:

zsh -c '
  for i in {1..10}
  do
     for j in {1..10}
     do
         echo "test inner"
     done
     echo "test outer"
  done'

或者

sh -c '
   i=1; while [ "$i" -le 10 ]
   do
     j=1; while [ "$j" -le 10 ]
     do
       echo "test inner"
       j=$((j + 1))
     done
     echo "test outer"
     i=$((i + 1))
  done'

但为此运行 100 个echo命令感觉很愚蠢,而您只需一个命令即可完成:

awk 'BEGIN{
  for (i=1; i<=10; i++) {
    for (j=1; j<=10; j++)
      print "test inner"
    print "test outer"
  }}'

如果您愿意,您可以将其放在一行中:

awk 'BEGIN{for(i=1;i<=10;i++){for(j=1;j<=10;j++)print"test inner";print"test outer"}}'

答案3

将其转换为单行。我;在正确的位置添加了一些:

for i in {1..10}; do for j in {1..10}; do echo "test inner ${j}"; done; echo "test outer ${i}"; done;

上面的行可以使用,bash但要运行它,sh -c您需要扩展{1..10}(据我所知),因为sh不支持该范围语法。在这种情况下,以下行对我有用:

sh -c 'for i in 1 2 3 4 5 6 7 8 9 10; do for j in 1 2 3 4 5 6 7 8 9 10; do echo "test inner ${j}"; done; echo "test outer ${i}"; done;'

注意:我添加了${j}${i}来确认。

相关内容