3

我想做一个非常简单的脚本:只想在我的电脑上找到一个程序的最新版本,比如 svn。我想将结果加载到一个变量中,比如 mysvn

所以我制作了这个脚本:


#!/bin/sh

mysvn="foobar"
best_ver=0
which -a svn | while read p
do
    version=$("$p" --version | grep 'version ' | grep -oE '[0-9.]+' | head -1)
    if [[ "$version" > "$best_ver" ]]
    then
        best_ver=$version
        mysvn="$p"
    fi
    echo $mysvn
done

echo $mysvn

其实很简单……但是在XP下运行的rxvt(我的伪linux终端)版本2.7.10下不起作用:最终输出字符串是foobar。

有人知道我为什么会遇到这个问题吗?

过去几个月我一直在写一些脚本,这是我第一次遇到这种行为。

注意:我知道如何使它工作,只需进行一些更改(只需将主线放入 $() )

4

2 回答 2

2

发生这种情况的原因是 while 循环是管道的一部分,并且(至少在 bash 中)管道中的任何 shell 命令总是在子 shell 中执行。当您在循环中设置 mysvn 时,它会在子shell中设置;当循环结束时,子shell 退出并且该值丢失。父 shell 的 mysvn 值永远不会改变。请参阅BashFAQ #024上一个问题

bash 中的标准解决方案是使用进程替换而不是管道:

while
...
done < <(which -a svn)

但请注意,这是一个仅限 bash 的功能,您必须#!/bin/bash其用作 shebang 才能使其工作。

于 2012-07-06T15:26:47.133 回答
0

在 Ubuntu 上:

:~$ which -a svn | while read p
> do
>   version=$("$p" --version | grep 'version ' | grep -oE '[0-9.]+' | head -1)
>   echo $version
> done
.

所以,你的版本.不是很好。

我试过这个,我认为这就是你要找的:

:~$ which -a svn | while read p
> do
>   version=$("$p" --version | grep -oE '[0-9.]+' | head -1)
>   echo $version
> done
1.7.5
于 2012-07-06T14:54:07.627 回答