単語ごとに変数の内容を反転します。

単語ごとに変数の内容を反転します。

だから変数があれば

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"

または、単に変数(おそらくvar自体)を使用してください。
注:このソリューションはglobbingや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含まれているアイテム(デフォルトでは、スペース、タブ、改行、nul)ではなくスペースにのみ分割する場合は、スペースを割り当てるか、$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

POSIXly(と一緒に使用することもできます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"

関連情報