在 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
参数中包含换行符没有问题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}
来确认。