如何在shell脚本中以相反的顺序打印参数?

时间:2016-10-17 06:54:00

标签: bash shell command-line-arguments

我正在尝试编写一个以相反顺序打印参数的脚本。 所以如果我输入bash reverse.sh一两三 我希望我的输出是三二一 我怎样才能做到这一点? 这就是我的尝试,它显然没有用......

#!/bin/bash
i=0
a="$"
for word in $*; do
  echo $a$(($#-i))
  i=$((i+1))
done  

这是我得到的输出

$3
$2
$1

我认为这会按顺序打印参数3,2,1,但它没有。我该怎么办?任何帮助都感激不尽。谢谢。

2 个答案:

答案 0 :(得分:5)

让我们定义你的论点:

$ set -- one two three

现在,让我们以相反的顺序打印出来:

$ for ((i=$#;i>=1;i--)); do echo "${!i}"; done
three
two
one

如何运作

for ((i=$#;i>=1;i--))启动一个循环,其中i$#倒计时到1.对于i的每个值,我们按{{1}打印相应的位置参数}。构造${!i}使用间接:而不是返回${!i}的值,i返回名称为${!i}的变量的值。< / p>

作为剧本

在多行脚本表单中,我们可以使用:

$i

举个例子:

$ cat reverse 
#!/bin/bash
for ((i=$#;i>=1;i--))
do
   echo "${!i}"
done

替代方案:使用tac

以相反顺序打印内容的另一种方法是使用实​​用程序$ bash reverse One Two Three Three Two One 。考虑一下这个脚本:

tac

以下是一个例子:

$ cat reverse2
#!/bin/bash
printf "%s\n" "$@" | tac

$ bash reverse2 Uno Dos Tres Tres Dos Uno 每行打印一个位置参数。 printf "%s\n" "$@"以相反的顺序打印这些行。

限制: tac方法只有在参数本身不包含换行符时才能正常工作。

答案 1 :(得分:-3)

您需要eval echo,即您需要评估扩展,而不是输出:

eval echo $a$(($#-i))

请注意,一般不建议使用eval,因为如果未对输入字符串进行清理,则可能会导致安全隐患。查看John1024's回答,了解如何在没有eval的情况下完成此操作。