我正在写一个 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 周围的sed
double 更清晰(前提是你有 grok 正则表达式)。您也可以使用(但这需要您了解 Awk)。rev
cut
awk -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,谢谢@三重。