Bash字符串连接不起作用 - concat的结果为空

时间:2015-05-07 10:00:30

标签: string bash concatenation

我尝试构建一个Git prepare-commit-msg钩子,它为git bash(mingw32)提供以下输出:

<file1>:
 -
<file2>:
 - 
...

#!/bin/bash
git diff --cached --name-status | while read line; do echo $OUTPUT$line$':\n - \n'; done

效果很好

git diff --cached --name-status为已更改的索引中的每个文件打印<mode>\t<filePath>

但是当我做的时候

#!/bin/bash
git diff --cached --name-status | while read line; do OUTPUT=$OUTPUT$line$':\n - \n'; done
echo $OUTPUT

#!/bin/bash
git diff --cached --name-status | while read line; do OUTPUT+=$line$':\n - \n'; done
echo $OUTPUT

$OUTPUT为空

这也可以正常使用

COUNTER=0
         while [  $COUNTER -lt 10 ]; do
             TEST+=$COUNTER$':\n'
             let COUNTER=COUNTER+1 
         done
echo $TEST

我做错了什么?

解决

#!/bin/bash
git diff --cached --name-status | { 
while read line; do
    output=$output$var$':\n  - \n'
done
echo "$output" > $1
}

2 个答案:

答案 0 :(得分:2)

因为您正在使用管道,Private Sub Worksheet_Activate() If Left(ActiveSheet.Name, 3) = "SOD" then Call Module1.Macro1 Call Module2.Macro2 End If End Sub 循环在子shell中运行,所以当子shell退出时,其变量随之消失。您离开 shell中的while变量,该变量为空。

您必须确保在父shell中构建OUTPUT:

$OUTPUT

或使用&#34; lastpipe&#34;设置为在当前shell中运行管道的最后一个命令(作业控制需要关闭)

while read line; do
    OUTPUT+=$line$':\n - \n'
done < <(git diff --name-status)
echo "$OUTPUT"

或者,在子shell中输出变量

set +m; shopt -s lastpipe
git diff --name-status | while read line; do OUTPUT+=$line$':\n - \n'; done
echo "$OUTPUT"

其他说明:

  • 如果您想保留所有这些换行符,则需要引用git diff --name-status | { while read line; do OUTPUT+="$line"$':\n - \n'; done echo "$OUTPUT" }
  • 摆脱使用UPPERCASEVARIABLES的习惯:保留为shell保留的内容。

答案 1 :(得分:1)

您根本不需要构建变量OUTPUT。只需在读取输入时写入输出。 (使用printf比使用echo更清晰,更标准。)

git diff --cached --name-status | while read line; do
    printf '%s:\n - \n' "$line"
done