按相反顺序打印bash参数
我必须写一个脚本,它将接受所有参数并以相反的方式打印它们 我已经提出了一个解决办法,但发现很糟糕。你有更聪明的主意吗按相反顺序打印bash参数,bash,Bash,我必须写一个脚本,它将接受所有参数并以相反的方式打印它们 我已经提出了一个解决办法,但发现很糟糕。你有更聪明的主意吗 #!/bin/sh > tekst.txt for i in $* do echo $i | cat - tekst.txt > temp && mv temp tekst.txt done cat tekst.txt 我能做到这一点 for (( i=$#;i>0;i-- ));do echo "${!i}" d
#!/bin/sh
> tekst.txt
for i in $*
do
echo $i | cat - tekst.txt > temp && mv temp tekst.txt
done
cat tekst.txt
我能做到这一点
for (( i=$#;i>0;i-- ));do
echo "${!i}"
done
这使用了下面的(
${!i}
朝向页面底部)
和$#
这是脚本的参数数bash:
#!/bin/bash
for i in "$@"; do
echo "$i"
done | tac
将此脚本称为:
./reverse 1 2 3 4
它将打印:
4
3
2
1
按空格反转简单字符串
简单地说:
#!/bin/sh
o=
for i;do
o="$i $o"
done
echo "$o"
将作为
./rev.sh 1 2 3 4
4 3 2 1
或
如果需要按参数输出一行
只需将echo替换为printf“%s\n”:
反转字符串数组
如果参数可以包含空格,则可以使用bash数组:
#!/bin/bash
declare -a o=()
for i;do
o=("$i" "${o[@]}")
done
printf "%s\n" "${o[@]}"
样本:
./rev.sh "Hello world" print will this
this
will
print
Hello world
您可以使用这一行:
echo $@ | tr ' ' '\n' | tac | tr '\n' ' '
可移植且位置固定,无阵列,使用空格和换行符: 反转位置参数:
flag=''; c=1; for a in "$@"; do set -- "$a" ${flag-"$@"}; unset flag; done
打印它们:
printf '<%s>' "$@"; echo
printf''“$@”;回声
您可以将每个变量添加到shell变量的前面。不要认为您需要将o
设置为空(至少在bash中)@999999999999999999999999999999 不,但是如果您想创建一个函数:rev(){local o i;for i;do o=“$i$o”;done;echo$o;}
,您必须确保开始时o
为空@999999999999999999999999999999 如果运行脚本:env o=“more text”。/rev.sh将打印此
,这将输出此将打印更多文本
!如果需要按参数输出一行:将使用glob字符中断。Geat除非任何参数中有空格,否则如果参数中有glob字符,也将中断;也将打破连续的空格;一种更好(更短、更有效)的方法:printf'%s\n'$@“| tac
。但是,如果参数中有换行符,则此操作也将中断。如果参数中包含换行符,则此操作将中断。一个较短的方法是:printf'%s\n'$@“| tac
。在算术求值中
i>0
是无用的:你可以:为((i=$#;i;i-){echo'${!i};}
@F.Hauri它在算术求值中不是无用的。在这种特殊情况下,请确保可以单独使用i
,但这只是因为0的计算结果为false。假设你想要每秒钟一个参数,并且有一个奇数。您将跳过零,并导致segfault
flag=''; c=1; for a in "$@"; do set -- "$a" ${flag-"$@"}; unset flag; done
printf '<%s>' "$@"; echo