echo $variable > 循环中的文件仅输出变量的最后一个值

echo $variable > 循环中的文件仅输出变量的最后一个值

这就是我想做的:
我有几个 git 存储库。我想为每个人设置一个推送部署脚本。由于懒得为每个存储库都这样做,所以我想编写脚本。

我的脚本为每个存储库生成一个接收后文件。

#!/bin/bash

REPOS=/var/opt/gitlab/git-data/repositories/user

for i in $(ls $REPOS)
do
        DEPLOY_DIR=/home/user/public_html/"$i"/
        POST_RECEIVE_DIR=$REPOS/"$i".git/hooks/post-receive

        echo -e '
from, to, branch = ARGF.read.split " "\r
\r
 # 3. Copy files to deploy directory\r
deploy_to_dir = File.expand_path('$DEPLOY_DIR')\r
`GIT_WORK_TREE="#{deploy_to_dir}" git checkout -f master`\r
puts "DEPLOY: master(#{to}) copied to '#{deploy_to_dir}'"\r
' > $POST_RECEIVE_DIR
        chmod +x $POST_RECEIVE_DIR

done

请注意,生成的文件中唯一发生更改的部分是 $DEPLOY_DIR 所在的位置。
$DEPLOY_DIR 随着每次迭代而变化。
问题是:所有生成的文件都具有 $DEPLOY_DIR 的 LAST 值。

为了调试,我尝试在脚本中的各个位置回显变量值,它们都会产生所需的输出。我认为这可能是缓冲区未刷新的问题。所以我尝试使用同步命令。我尝试使用 cat 而不是 echo 。我尝试将文件作为参数传递给 python 脚本,在其中写入文件并刷新缓冲区。

一切都失败了。

答案1

答案就隐藏在你的问题里。

 echo $variable > file in a loop outputs only the last value of variable

显然只会输出最后一个值。

相反,答案是

echo $variable >> file in a loop outputs all the values of variable

>附加值时覆盖它>>。因此,如果您在循环中仅使用 > ,它将继续覆盖,并且只有最后一个值会出现在文件末尾。

     ijaz@ijaz-HP-EliteBook-8560p:~$ echo hi>test1
     ijaz@ijaz-HP-EliteBook-8560p:~$ cat test1
     hi
     ijaz@ijaz-HP-EliteBook-8560p:~$ echo hello>test1
     ijaz@ijaz-HP-EliteBook-8560p:~$ cat test1
     hello
     ijaz@ijaz-HP-EliteBook-8560p:~$ echo hello1>>test1
     ijaz@ijaz-HP-EliteBook-8560p:~$ cat test1
     hello
     hello1
     ijaz@ijaz-HP-EliteBook-8560p:~$ 

答案2

在我看来,您在某处有引用错误。

尝试使用“此处文档”输出脚本:

    cat <<__EOF >"$POST_RECEIVE_DIR"
from, to, branch = ARGF.read.split " "

# 3. Copy files to deploy directory
deploy_to_dir = File.expand_path('$DEPLOY_DIR')
GIT_WORK_TREE="#{deploy_to_dir}" git checkout -f master
puts "DEPLOY: master(#{to}) copied to '#{deploy_to_dir}'"
__EOF

另外,s 是怎么回事\r?您是否正在尝试写入 DOS 文件?

相关内容