我想做一个非常简单的脚本:只想在我的电脑上找到程序的最新版本,比如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。
有人知道我为什么会遇到这个问题吗?
过去几个月我一直在写一些剧本,这是我第一次遇到这样的行为。
注意:我知道如何使其工作,只需进行一些更改(只需将主线放入$())
答案 0 :(得分:2)
发生这种情况的原因是while循环是管道的一部分,并且(至少在bash中)管道中的任何shell命令总是在子shell中执行。当你在循环中设置mysvn时,它会在子shell中设置;当循环结束时,子shell退出并且该值丢失。父shell的mysvn值永远不会改变。请参阅BashFAQ #024和this 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