Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash循环中的多个变量_Bash_Svn - Fatal编程技术网

bash循环中的多个变量

bash循环中的多个变量,bash,svn,Bash,Svn,我正在编写一个shell脚本,获取svn中某个目录的状态,然后在其中循环并添加或删除文件 这个svn命令 $ svn status /myLocalDir/files 返回我在本地添加或删除的文件。?=加上删除 ! /myLocalDir/files/deletedPicture.png ? /myLocalDir/files/addedPicture.png 我在bash脚本中使用了一个循环(见下文)。我需要做的是,当我在已添加或删除的文件/文件夹的根目录中循环

我正在编写一个shell脚本,获取svn中某个目录的状态,然后在其中循环并添加或删除文件

这个svn命令

$ svn status /myLocalDir/files
返回我在本地添加或删除的文件。?=加上删除

!        /myLocalDir/files/deletedPicture.png
?        /myLocalDir/files/addedPicture.png
我在bash脚本中使用了一个循环(见下文)。我需要做的是,当我在已添加或删除的文件/文件夹的根目录中循环时,我需要

A.打印“删除”[X]或“添加”[X]

B.根据第一个字符(?,!)确定是否应删除或将循环中的当前文件添加到svn

我只是不知道如何解析字符串“!/myLocalDir/files/deletedPicture.png”的语法

for X in `svn status /myLocalDir/files | cut -c 8-300`
            do  
                if [ "!" ]
                    then
                        echo "Deleting " $X
                        #svn $CREDENTIALS delete $X
                    else
                        echo "Adding " $X
                        #svn $CREDENTIALS  add $X
                fi

            done
我注意到的另一件事。。甚至认为svn在命令行中的状态

!        /myLocalDir/files/deletedPicture.png
?        /myLocalDir/files/addedPicture.png
我的bash循环回声是这样的

!        
/myLocalDir/files/deletedPicture.png
?
/myLocalDir/files/addedPicture.png

如果你想检查的是第一个单词,把剩下的作为第二个单词,那么你可以这样做:

svn status /myLocalDir/files | while IFS= " " read -r line;
            do  
            read a b <<<$line

                if [ $a == "!" ]
                    then
                        echo "Deleting " "$b"
                        #svn $CREDENTIALS delete $b
                    else
                        echo "Adding " "$b"
                        #svn $CREDENTIALS  add $b
                fi
            done 
svn status/myLocalDir/files |而IFS=”“read-r行;
做

阅读b
X
只会是一个字段,而不是一整行,就像您编写代码的方式一样。试试这个:

while IFS= read -r status file; do
    case $status in
      \! )  echo "Deleting" ;;
      \? ) echo "Adding" ;;
      # etc.
    esac
done <( svn status /myLocalDir/files )

好的,你可以用更简单、优雅(甚至是正确)的方式来做

  • 在一个命令中添加树中的所有新文件:
    svn add--force/myLocalDir/files/*
    (-force是必需的,因为已经有版本化的文件,这些文件会产生警告“…已经在版本控制下”),也许它可以在没有--force的情况下使用,但可以使用-q来抑制输出
  • 带管道的一个衬里,用于添加|删除,无需大的bashism:
svn status | awk'/\?/{print$2}| xargs svn add


svn状态| awk'/\!/{print$2}'| xargs svn rm

编辑:为stat添加了所有可能的字段。有关其含义和值,请参见
svn help status

treeConflict=" "
oldIFS="$IFS"
IFS=$'\n'
for line in $(svn stat "$path")
do 
   if [[ "$treeConflict" == "C" ]]; then
       continue # skip or handle tree conflict line
   fi

   operation="${line:0:1}"
   modifications="${line:1:1}"
   lock="${line:2:1}"
   history="${line:3:1}"
   external="${line:4:1}"
   repoLock="${line:5:1}"
   treeConflict="${line:6:1}"
   file="$(echo ${line} | sed "s#^.......##")"
done
IFS="$oldIFS"

感谢所有的投入!!但这正是我想要的。。我真正需要做的就是根据字符串的第一个字符确定基数,这个字符是delete,这个字符是add,所以我将它作为子字符串。我用破折号替换空格,解决了我的for循环问题,然后根据我的条件对每个空格进行子串

for X in `svn status /myLocalDir/files |tr " " "-"`
            do  
                if [ ${X:0:1} == "!" ]
                    then
                        echo "Deleting " ${X:8}
                        svn delete ${X:8}
                    elif [ ${X:0:1} == "?" ]
                        echo "Adding " ${X:8}
                        svn add ${X:8}
                fi

            done

状态有两个以上的变化,请阅读
svn help Status
。你失败了,我不知道它会像前面提到的那样打印多少列。如果只需要检查第一个单词,那么这将起作用。。他的第一个解决方案并不是那么简单base@LazyBadger这个问题在bash中也有标记。OP只提到了两种状态。我不必阅读svn返回的内容。我根据给出的回答。此外,注意你的语言。不同意是可以的。但虐待是不存在的。如果有任何额外的旗帜出现,这将打破。一种修复方法是稍微更改条件并使用参数扩展:
whileifs=read-r行;do file=“${line#?????}”;status=“${line%$file}”;“!”*)中的大小写“$status”echo“使用$file做某事”;“?”*)echo“使用$file做其他事情”;;以撒;完成
很好。我已经有一段时间没有使用
svn
,并且完全忘记了
status
命令可能返回的内容。您需要修复编辑以包含读取调用的未设置IFS,否则将删除前导空格(这很糟糕,因为这样会破坏参数扩展以删除列)。我关心的是?或添加或删除的文件,然后忽略不需要的字段。您仍然有$operation和$file。这是来自svn帮助状态“?”项不受版本控制“!”项目缺失(由非svn命令删除)或不完整,甚至
svn状态| sed-ne的/^?/svn add/p;s/^/svn rm/p'| sh
只要文件名不包含不兼容的字符,如空格。
for X in `svn status /myLocalDir/files |tr " " "-"`
            do  
                if [ ${X:0:1} == "!" ]
                    then
                        echo "Deleting " ${X:8}
                        svn delete ${X:8}
                    elif [ ${X:0:1} == "?" ]
                        echo "Adding " ${X:8}
                        svn add ${X:8}
                fi

            done