【问题标题】:Print bash arguments in reverse order以相反的顺序打印 bash 参数
【发布时间】:2021-08-23 12:24:46
【问题描述】:

我必须编写一个脚本,它将接受所有参数并反向打印它们。

我已经提出了一个解决方案,但发现它非常糟糕。你有更聪明的主意吗?

#!/bin/sh
> tekst.txt

for i in $* 
do
    echo $i | cat - tekst.txt > temp && mv temp tekst.txt
done

cat tekst.txt

【问题讨论】:

  • 您可以将每个添加到 shell 变量的前面。

标签: bash


【解决方案1】:

可以这样做

for (( i=$#;i>0;i-- ));do
        echo "${!i}"
done

这使用下面的
c style for loop
Parameter indirect expansion${!i}向页面底部)

$# 是脚本的参数个数

【讨论】:

  • ARITHMETIC EVALUATION i>0 没用:你可以:for((i=$#;i;i--)){ echo "${!i}";}
  • @F.Hauri 在算术评估中并非没用。在这种特殊情况下,您当然可以单独使用i,但这只是因为 0 的计算结果为 false。想象一下,你想要每个第二个参数,并且有一个奇数。您将跳过零并导致段错误
【解决方案2】:

重击:

#!/bin/bash
for i in "$@"; do
    echo "$i"
done | tac

像这样调用这个脚本:

./reverse 1 2 3 4

它会打印出来:

4
3
2
1

【讨论】:

  • 如果参数包含换行符将中断。更短的方法是:printf '%s\n' "$@" | tac.
【解决方案3】:

用空格反转一个简单的字符串

简单地说:

#!/bin/sh
o=
for i;do
    o="$i $o"
    done
echo "$o"

将作为

./rev.sh 1 2 3 4
4 3 2 1

或者

./rev.sh world! Hello
Hello world!

如果需要按参数输出一行

只需将echo 替换为printf "%s\n"

#!/bin/sh
o=
for i;do
    o="$i $o"
    done

printf "%s\n" $o

反转字符串数组

如果你的参数可以包含空格,你可以使用 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

【讨论】:

  • 不要认为您需要将 o 设置为空(至少在 bash 中)。
  • @99999999999999999999999999999 不,但是如果你想创建一个函数:rev() { local o i;for i;do o="$i $o";done;echo $o;},你必须确保o在开始时为空。
  • @999999999999999999999999999999 如果你运行你的脚本:env o="more text" ./rev.sh print will this,这将输出this will print more text
  • 如果需要按参数输出一行: 会被全局字符打断。
【解决方案4】:

你可以使用这一个班轮:

echo $@ | tr ' ' '\n' | tac | tr '\n' ' '

【讨论】:

  • Geat 除非你的任何参数中有空格
  • 如果参数中有全局字符,也会中断;也会打破连续的空格;一种更好(更短更高效)的方法:printf '%s\n' "$@" | tac。但是,如果您的论点中有换行符,这也会中断。
【解决方案5】:

可移植且 POSIXly,无需数组,使用空格和换行符:

反转位置参数:

flag=''; c=1; for a in "$@"; do set -- "$a" ${flag-"$@"}; unset flag; done

打印它们:

printf '<%s>' "$@"; echo

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多