Linux

用單詞反轉變數的內容

  • March 17, 2017

所以如果我有一個變數

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

在 GNU 系統上,cat 的反義詞是 tac:

$ tac -s" " <<< "$VAR "            # Please note the added final space.
100 90 80 70 60 50 40 30 20 10

對於一個簡短的列表,並且在一個變數中,shell 本身是最快的解決方案:

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 本身):

注意:此解決方案不受 globing 或 IFS 的影響。

var="10 20 30 40 50 60 70 80 90 100"

a=" $var"
while [[ $a ]]; do
   printf '<%s>' "${a##* }"
   var="${a% *}"
done

引用自:https://unix.stackexchange.com/questions/320783