我正在尝试编写一个以相反顺序打印参数的脚本。 所以如果我输入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,但它没有。我该怎么办?任何帮助都感激不尽。谢谢。
答案 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
以相反顺序打印内容的另一种方法是使用实用程序$ 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
的情况下完成此操作。