管道进入 if 语句?

Phi*_*ide 2 bash pipe shell-script

我正在编写一个 bash 脚本。我有一系列管道来获取 git 存储库上的所有分支:

git ls-remote $1 'refs/heads/*' \
  | rev \
  | cut -d'/' -f1 \
  | rev \
  | if [ -z $2 ]
      then
        echo {}
      else
        echo {} > $2
    fi
Run Code Online (Sandbox Code Playgroud)

目前,if 语句部分无法正常工作。我用什么来代替{}它来完成这项工作?

tri*_*eee 7

要将标准输入复制到标准输出,请使用cat,而不是echo

git ls-remote "$1" 'refs/heads/*' |
sed 's~.*/~~' |
if [ -z "$2" ]
  then
    cat
  else
    cat > "$2"
fi
Run Code Online (Sandbox Code Playgroud)

还要注意引号的正确使用和管道的放置,这样您就可以避免使用反斜杠。的使用sed是一个非常小的优化,但我也发现它比reva 周围的 double 更清晰cut(前提是您了解正则表达式)。您也可以使用awk -F/ '{ print $NF }'(但那需要您熟悉 Awk)。

你可以cat通过这样做来避免;

${2+exec >"$2"}
git ls-remote "$1" | sed 's~.*/~~'
Run Code Online (Sandbox Code Playgroud)

(如果您将空字符串作为第二个参数传递,则失败至少应该比 with 更明确,如果不一定更有帮助[ -z,它无法区分未设置和空值。)


eus*_*h77 5

您可以替换{}您尝试使用的语法,cat因为您正在尝试从中读取stdin

git ls-remote $1 'refs/heads/*' \
  | rev \
  | cut -d'/' -f1 \
  | rev \
  | if [ -z $2 ]
      then
        cat
      else
        cat > $2
    fi
Run Code Online (Sandbox Code Playgroud)

更新:不需要子shell,谢谢@tripleee