
그래서 변수가 하나 있으면
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 자체일 수 있음)만 사용:
참고: 이 솔루션은 글로빙이나 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"
With awk
(큰 변수, 특히 의 경우 더 좋지만 bash
인수(또는 단일 인수)의 크기 제한까지):
awk '
BEGIN {
n = split(ARGV[1], a);
while (n) {printf "%s", sep a[n--]; sep = " "}
print ""
}' "$VAR"