我有一组有效字符[0-9a-zA-Z]和一个分配了其中一个字符的变量。我想要做的是能够将该变量减少到集合中的下一个。
我无法弄清楚如何递减字母,它仅适用于数字。
#!/bin/bash
test=b
echo $test # this shows 'b'
let test-=1
echo $test # I want it to be 'a'
答案 0 :(得分:1)
的优势
test=$(tr 1-9a-zA-Z 0-9a-zA-Y <<<"$test")
是正确的(我认为)将a
递减到9
和A
递减到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
答案 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)。
它可能会扩展为多个字符,但不会被问到。