减少包含字母的变量

时间:2016-11-03 03:07:02

标签: linux bash ubuntu sed

我有一组有效字符[0-9a-zA-Z]和一个分配了其中一个字符的变量。我想要做的是能够将该变量减少到集合中的下一个。

我无法弄清楚如何递减字母,它仅适用于数字。

#!/bin/bash
test=b
echo $test  # this shows 'b'
let test-=1
echo $test  # I want it to be 'a'

4 个答案:

答案 0 :(得分:1)

的优势
test=$(tr 1-9a-zA-Z 0-9a-zA-Y <<<"$test")

是正确的(我认为)将a递减到9A递减到z。如果这不是您想要的顺序,则很容易调整。

有关详细信息,请参阅 man tr。这是tr的Gnu版本; Posix不保证字符范围,但大多数tr实现都有它们。 <<<“here strings”也是一个常见的扩展,bash实现。

答案 1 :(得分:0)

test=$(printf "\\$(printf '%03o' "$(($(printf '%d' "'$test") - 1 ))")")

答案 2 :(得分:0)

你可以试试这个:

#!/bin/bash

test=b

if [[ $test == A || $test == a || $test == 0 ]]
then
    echo "character already at lowest value"
else
    # convert $test to decimal digit
    test_digit=$(printf '%d' "'$test")

    decremented=$(( test_digit - 1 ))

    # print $decremented as a char
    printf "\\$(printf '%03o' "$decremented")\n"
fi

参考:
http://mywiki.wooledge.org/BashFAQ/071

答案 3 :(得分:0)

如果我们将变量(比如a)设置为整个字符串:

$ a=$( IFS=''; set -- {0..9} {a..z} {A..Z}; echo "$*"); echo "$a"
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

我们可以利用bash&#34;算法&#34;可以使用最多62个基数(与所提供的字母顺序相同)。

$ test="A"; echo "${a:$((62#$test-1)):1}"
z

这仅适用于&#34;一个角色&#34; (而不是0)。

它可能会扩展为多个字符,但不会被问到。