Linux
用單詞反轉變數的內容
所以如果我有一個變數
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