Bash - 变量的错误赋值

时间:2012-07-06 14:35:44

标签: bash

我想做一个非常简单的脚本:只想在我的电脑上找到程序的最新版本,比如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。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

但请注意,这是一个仅限bash的功能,并且必须使用#!/bin/bash作为你的shebang才能使用它。

答案 1 :(得分: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