Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按相反顺序打印bash参数_Bash - Fatal编程技术网

按相反顺序打印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