使用shell命令“select”时如何反转数字?

时间:2017-01-11 03:39:09

标签: bash shell

v.sh

select f in "$@" ; do
    echo $f
done

v.sh a b c结果如下:

1) a
2) b
3) c
#? 

但我想在下面这个,我可以选择选项。

3) a
2) b
1) c
#? 

如何轻松解决? Thx提前。

2 个答案:

答案 0 :(得分:2)

你无法反转select的自动编号,但你可以反转执行相同工作的逻辑(逻辑上)。

这个单线测试在我的bash中正常工作,并且选择对应于正确的反转项目:

$: function test { select f in $(echo $@|rev) ;do echo $f;done;};test a b c
1) c
2) b
3) a
#? 1
c
#? 2
b
#? 3
a

PS:在你的脚本中你不需要这个功能。你只需申请

select f in $(echo $@|rev) ;do
    echo $f
done

<强>更新
正如评论中所述,使用rev来恢复args对单个字符args有效,例如OP示例(a b c)。
如果一个论证由更多的字符组成(即cd),那么rev也将恢复这个arg(即dc)。

在这种情况下,以相反的顺序将args存储在数组中会更安全,然后select会像这样引用这个恢复的数组:

$: function test { local arr;for ((i=${#@};i>0;i--));do \ 
arr+=("${@:$i:1}");done;select f in "${arr[@]}";do echo "$f";done;};test a b cd
1) cd
2) b
3) a
#? 1
cd

此外,必须注意使用*作为参数。必须引用它(即'*'),否则bash会将其扩展为当前工作目录的内容。这个限制甚至适用于OP的第一个例子。

答案 1 :(得分:1)

如上所述,您无法修改private async void roll_in() { while (UC.Instance.Location.X < panel.Location.X) { UC.Instance.Location = new Point((UC.Instance.Location.X + 2)); UC.Instance.Refresh(); if (UC.Instance.Location.X > -10) await Task.Delay(10); } } 的编号,但您可以创建自定义select实施:

select

chepner寻求帮助的提示。