Bash:tr命令,带有表示字符的变量

Bash:tr命令,带有表示字符的变量,bash,variables,ascii,tr,Bash,Variables,Ascii,Tr,我想使用tr命令将字符映射到新字符,例如: echo“hello”| tr'[a-z]'[b-za-b]'将输出:ifmmp (小写字母表中的每个字母向右移动一个) 请参见下面的“[b-za-b]”到新字符的映射: [a b c d e f g h i j k l m n o p q r s t u v w x y z]将映射到: [b c d e f g h i j k l m n o p q r s t u v w x y z a] 但是,当我希望它旋转多次时,如何使用变量来控制tr命令的

我想使用tr命令将字符映射到新字符,例如:

echo“hello”| tr'[a-z]'[b-za-b]'
将输出:
ifmmp

(小写字母表中的每个字母向右移动一个)

请参见下面的
“[b-za-b]”
到新字符的映射:

[a b c d e f g h i j k l m n o p q r s t u v w x y z]
将映射到:

[b c d e f g h i j k l m n o p q r s t u v w x y z a]


但是,当我希望它旋转多次时,如何使用变量来控制tr命令的旋转值

例如:对于1班:

echo“hello”| tr'[a-z]'[b-za-b]'
不带变量和:

echo“hello”| tr'[a-z]'[(a+$var)-za-(a+$var)]”
where$var=1

这里我有:
(a+$var)-z
表示与
b-z
相同

………
a-(a+$var)
表示与
a-b

我曾尝试将ascii值转换为字符以在tr命令中使用,但我认为这是不允许的

我的问题是bash没有解释:

(a+$var)
作为字符
b
当$var=1时

(a+$var)
作为字符
c
当$var=2时

。。。等等

如何告诉bash将这些方程解释为tr命令的字符

编辑

我尝试使用数组执行此操作,但不起作用:

字符=({a..z})

var=2

回音“hello”| tr'[a-z]'[(${chars[var]}-z)(a-${chars[var]})]”

我使用:
(${chars[var]}-z)
来表示
b-z
,其中var=1


因为
${chars[1]}
b
,但这不起作用。我遗漏了什么吗?

你可以使用八进制
\XXX
字符代码来完成你想要的任务。使用八进制代码,您可以对数字进行任何算术运算,然后将其转换为字符代码

#rotr x
#

#如果0您试图做的事情无法使用不满足您要求的
tr
来完成。此外,当您打算在
bash
中修改并使用变量添加到glob模式时,这是您不可能做到的

有一个巧妙的小技巧,你可以用bash数组!。
tr
命令也可以在普通glob模式上采用扩展的数组序列。首先将源数组定义为

source=()
现在,使用大括号扩展将其内容添加为
a-z
的字符范围列表

source=({a..z})
现在对于音译数组,从源数组开始,使用索引打印数组元素,按照如下方式构造它

trans=()
使用语法
${array[@]:(-num)}
从最后一个数组中获取数组元素的技巧将获得元素的总长度-num。因此,首先构建阵列

var=2
trans+=( "${source[@]:(-(26-$var))}" )
现在要构建数组的第二部分,请使用另一个技巧
${array[@]:0:num}
获取元素的第一个
num
数量

trans+=( "${source[@]:0:$(( $var + 1 ))}" )
因此,我们现在所做的是,对于给定的
var=2
,我们将
trans
数组构建为

echo "${trans[@]}"
c d e f g h i j k l m n o p q r s t u v w x y z a b c
现在,您可以在
tr
命令中轻松地使用它

echo "hello" | tr "${source[*]}" "${trans[*]}"
jgnnq
您可以将其全部放在函数中,并将其值打印为

transChar() {
    local source
    local trans
    local result
    source=({a..z})
    trans=()
    var="$2"
    input="$1"
    trans+=( "${source[@]:(-(26-$var))}" )
    trans+=( "${source[@]:0:$(( $var + 1 ))}" )
    result=$( echo "$input" | tr "${source[*]}" "${trans[*]}" )
    echo "$result"
}
一些测试

transChar "hello" 1
ifmmp

transChar "hello" 2
jgnnq

transChar "hello" 3
khoor
随机腐烂:

# generate alphabet as arr:
arr=( {1..26} ) 
i=$(($RANDOM%24+1))
# left and right
l=$(echo ${arr[$i]})
r=$(echo ${arr[$i+1]})
# reusing arr for testing:
echo ${arr[@]} | tr "a-z" "$r-za-$l"

echo "secret:"  | tr "a-z" "$r-za-$l" ; echo $l $r $i
amkzmb:
h i 7
使用带有
ord()
chr()
函数、Python、Perl、C等的语言…请参阅:
transChar "hello" 1
ifmmp

transChar "hello" 2
jgnnq

transChar "hello" 3
khoor
# generate alphabet as arr:
arr=( {1..26} ) 
i=$(($RANDOM%24+1))
# left and right
l=$(echo ${arr[$i]})
r=$(echo ${arr[$i+1]})
# reusing arr for testing:
echo ${arr[@]} | tr "a-z" "$r-za-$l"

echo "secret:"  | tr "a-z" "$r-za-$l" ; echo $l $r $i
amkzmb:
h i 7