
変数があれば
VAR='10 20 30 40 50 60 70 80 90 100'
そしてそれを繰り返す
echo "$VAR"
10 20 30 40 50 60 70 80 90 100
しかし、スクリプトのさらに下では、この変数の順序を逆にして、次のように表示する必要があります。
echo "$VAR" | <code to reverse it>
100 90 80 70 60 50 40 30 20 10
私はrevを使ってみましたが、文字通りすべてを逆転させたので、
echo "$VAR" | rev
001 09 08 07 06 05 04 03 02 01
答え1
GNU システムでは、cat の逆は tac です。
$ tac -s" " <<< "$VAR " # Please note the added final space.
100 90 80 70 60 50 40 30 20 10
答え2
短いリストと変数の場合、シェル自体が最も高速なソリューションです。
var="10 20 30 40 50 60 70 80 90 100"
set -- $var; unset a
for ((i=$#;i>0;i--)); do
printf '%s%s' "${a:+ }" "${!i}"
a=1
done
echo
出力:
100 90 80 70 60 50 40 30 20 10
注: の分割操作は、set -- $var
ここで使用されている正確な文字列に対しては安全ですが、文字列にワイルドカード文字 ( *
、?
または[]
) が含まれている場合は安全ではありません。必要に応じて、分割の前に を使用して回避できますset -f
。同じ注意は、次のソリューションにも適用されます (特に記載がない限り)。
または、逆リストを使用して他の変数を設定する場合:
var="10 20 30 40 50 60 70 80 90 100"
set -- $var
for i; do out="$i${out:+ }$out"; done
echo "$out"
または、位置パラメータのみを使用します。
var="10 20 30 40 50 60 70 80 90 100"
set -- $var
a=''
for i
do set -- "$i${a:+ $@}"
a=1
done
echo "$1"
または、1 つの変数のみ (var 自体の場合もあります) を使用する方法:
注: このソリューションは、グロビングや IFS の影響を受けません。
var="10 20 30 40 50 60 70 80 90 100"
a=" $var"
while [[ $a ]]; do
printf '<%s>' "${a##* }"
var="${a% *}"
done
答え3
awk
救助へ
$ var='10 20 30 40 50 60 70 80 90 100'
$ echo "$var" | awk '{for(i=NF; i>0; i--) printf i==1 ? $i"\n" : $i" "}'
100 90 80 70 60 50 40 30 20 10
、perl
礼儀IP アドレスを逆から読むにはどうすればいいですか?@steeldriver がシェア
$ echo "$var" | perl -lane '$,=" "; print reverse @F'
100 90 80 70 60 50 40 30 20 10
または、bash
文字列を配列に変換してそれ自身と組み合わせる
$ arr=($var)
$ for ((i=${#arr[@]}-1; i>=0; i--)); do printf "${arr[i]} "; done; echo
100 90 80 70 60 50 40 30 20 10
答え4
zsh
:
print -r -- ${(Oa)=VAR}
$=VAR
$VAR
で分割します$IFS
。(Oa)
結果のリストを逆配列順に並べます。print -r --
( のようにksh
)、echo -E -
(zsh
特定)と同じです。信頼できるバージョンのecho
: 引数をそのままスペースで区切って出力し、改行で終了します。
$IFS
スペースのみで分割し、その内容 (デフォルトではスペース、タブ、改行、ヌル)に基づいて分割しない場合は、 にスペースを割り当てる$IFS
か、次のような明示的な分割を使用します。
print -r -- ${(Oas: :)VAR}
逆の数値順に並べ替えるには:
$ VAR='50 10 20 90 100 30 60 40 70 80'
$ print -r -- ${(nOn)=VAR}
100 90 80 70 60 50 40 30 20 10
POSIX 準拠 ( も動作しますbash
):
シェル組み込みメカニズムのみ(一部のシェルを除くprintf
)(短い値を持つ変数に適しています):
unset -v IFS # restore IFS to its default value of spc, tab, nl
set -o noglob # disable glob
set -- $VAR # use the split+glob operator to assign the words to $1, $2...
reversed_VAR= sep=
for i do
reversed_VAR=$i$sep$reversed_VAR
sep=' '
done
printf '%s\n' "$reversed_VAR"
awk
(大きな変数、特に の場合はより適していますbash
が、引数のサイズ(または単一の引数のサイズ)の制限まで)の場合:
awk '
BEGIN {
n = split(ARGV[1], a);
while (n) {printf "%s", sep a[n--]; sep = " "}
print ""
}' "$VAR"