管道到 if 语句?

管道到 if 语句?

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

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

目前,其中的 if 语句部分无法正常工作。我要替换什么{}才能使这项工作正常进行?

答案1

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

git ls-remote "$1" 'refs/heads/*' |
sed 's~.*/~~' |
if [ -z "$2" ]
  then
    cat
  else
    cat > "$2"
fi

另请注意引号的正确使用和管道的放置,以便避免使用反斜杠。使用是一个非常小的优化,但我也发现它比a 周围的seddouble 更清晰(前提是你有 grok 正则表达式)。您也可以使用(但这需要您了解 Awk)。revcutawk -F/ '{ print $NF }'

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

${2+exec >"$2"}
git ls-remote "$1" | sed 's~.*/~~'

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

答案2

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

git ls-remote $1 'refs/heads/*' \
  | rev \
  | cut -d'/' -f1 \
  | rev \
  | if [ -z $2 ]
      then
        cat
      else
        cat > $2
    fi

更新: 不需要子shell,谢谢@三重

相关内容