Bash中的无条件do done块

Bash中的无条件do done块,bash,shell,Bash,Shell,我在Bash脚本中有一块echo语句,需要通过管道传输到FTP命令。我做到了,但我需要无条件地做到 所以我编了一个伪if语句,像这样: if [[ 1 -eq 1 ]]; then echo "..." # ... fi | ftp -n 我试着直接做。。。done块没有条件,但它不喜欢语法错误:get do,期望换行符 很明显,这是可行的,但是有没有办法消除if语句并在Bash中使用匿名或无条件do块呢?我必须通过管道将所有输出传输到FTP,但仅限于该块的输出;脚本的其余部分用于脚本

我在Bash脚本中有一块echo语句,需要通过管道传输到FTP命令。我做到了,但我需要无条件地做到

所以我编了一个伪if语句,像这样:

if [[ 1 -eq 1 ]]; then
  echo "..."
  # ...
fi | ftp -n
我试着直接做。。。done块没有条件,但它不喜欢语法错误:get do,期望换行符

很明显,这是可行的,但是有没有办法消除if语句并在Bash中使用匿名或无条件do块呢?我必须通过管道将所有输出传输到FTP,但仅限于该块的输出;脚本的其余部分用于脚本的实际处理


只是好奇。

使用大括号来分隔块:

{
    echo 1...
    echo 2...
} | ftp -n
或者,使用此处文档:

cat << EOF | ftp -n
1...
2...
EOF

使用大括号分隔块:

{
    echo 1...
    echo 2...
} | ftp -n
或者,使用此处文档:

cat << EOF | ftp -n
1...
2...
EOF

你可以直接用它。例如:

(
    echo 1
    echo 2
) | sed 's/^/x/'
将为您提供:

x1
x2
您也可以使用{}代替。通常情况下,这将导致在当前shell的上下文中运行,而不是在子shell中运行,但事实上它在管道中,这将使moot-bash无论如何都在子shell中运行它


另外,作为一个旁白,尽管可能与这个问题无关,因为你正在试图删除它,你的if[[1-eq 1]]语句可以被更简洁的if-true替换。

你可以用它来代替。例如:

(
    echo 1
    echo 2
) | sed 's/^/x/'
将为您提供:

x1
x2
您也可以使用{}代替。通常情况下,这将导致在当前shell的上下文中运行,而不是在子shell中运行,但事实上它在管道中,这将使moot-bash无论如何都在子shell中运行它


另外,作为一个旁白,尽管可能与这个问题无关,因为您正在试图删除它,您的if[[1-eq 1]]语句可以替换为更简洁的if true。

其他答案已经足够,但另一个解决方法是使用printf:


其他答案已经足够了,但另一个解决方法是使用printf:


完美的谢谢我以前使用过herdoc,但是我需要一种动态构建子命令列表的方法,所以我选择了echo/pipe解决方案。请注意,如果将}与上一个命令放在同一行,则需要在它前面加一个分号,这样它就不会被误认为只是一个参数。也就是说,呼应任何东西;}将结束块,但echo which}将只打印which}。完美!谢谢我以前使用过herdoc,但是我需要一种动态构建子命令列表的方法,所以我选择了echo/pipe解决方案。请注意,如果将}与上一个命令放在同一行,则需要在它前面加一个分号,这样它就不会被误认为只是一个参数。也就是说,呼应任何东西;}将结束块,但echo which}将只打印which}。如果需要动态生成要打印的内容,可以在数组toprint=first line second line中构建它;toprint+=第三行;等并且使用printf'$s\n'${toprint[@]}打印它。更简洁,但同样没有意义:if:;然后不过,这个习惯用法适用于无条件循环;toprint+=第三行;等并且使用printf'$s\n'${toprint[@]}打印它。更简洁,但同样没有意义:if:;然后这个习惯用法适用于无条件循环。@ruakh,我在前面的评论中引用的内容直接来自bash手册页,但我想我明白了你的意思,代码在管道中这一事实意味着和{}之间没有真正的区别——管道将两者都放入子shell中。我将对此进行更新,但是,如果你是指其他内容,请进一步解释,并可能添加引用。Re:事实上,代码在管道中,这意味着和{}之间没有真正的区别-管道将两者都放入子shell中:是的,这正是我所指的。@ruakh,我在前面的评论中引用的话直接来自bash主页,但我想我看到了您的来源,代码在管道中的事实意味着和{}之间没有真正的区别-管道将两者都放入子shell中。我将对此进行更新,但是,如果你是指其他内容,请进一步解释,并可能添加引用。Re:事实上,代码在管道中,这意味着和{}之间没有真正的区别-管道将两者都放入子shell:是的,这正是我所指的。