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

use*_*231 3 variables bash 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命令的旋转值?

例如:对于1班次

echo "hello" | tr '[a-z]' '[b-za-b]' 没有变量和:

echo "hello" | tr '[a-z]' '[(a+$var)-za-(a+$var)]' 其中$ var = 1

我在这里:(a+$var)-z代表b-z

.................... a-(a+$var)代表与a-b

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

我的问题是bash无法解释:

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

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

...等

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

编辑

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

字符=({a..z})

var = 2

回声“你好” | tr'[az]''[(($ {chars [var]}-z)(a-$ {chars [var]})]'''

我用过:(${chars[var]}-z)代表b-zvar = 1

因为${chars[1]}是,b但这不起作用。我想念什么吗?

Ini*_*ian 5

你所要做的不能用做tr它不会处理您的要求。而且,当您打算修改变量并使用变量将其添加到全局模式时bash,您将无法执行此操作。

您可以使用bash数组做一个巧妙的小技巧!该tr命令还可以在普通的glob模式上采用扩展的数组序列。首先定义一个源数组为

source=()
Run Code Online (Sandbox Code Playgroud)

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

source=({a..z})
Run Code Online (Sandbox Code Playgroud)

现在对于音译数组,从源数组开始,通过使用索引来打印数组元素,以如下方式构造它

trans=()
Run Code Online (Sandbox Code Playgroud)

使用技巧从句法中${array[@]: (-num)}获取最后一个数组元素将获得总长度-元素数。所以首先将数组构建为

var=2
trans+=( "${source[@]:(-(26-$var))}" )
Run Code Online (Sandbox Code Playgroud)

现在要构建数组的第二部分,请使用另一个技巧${array[@]:0:num}来获取第一个num元素。

trans+=( "${source[@]:0:$(( $var + 1 ))}" )
Run Code Online (Sandbox Code Playgroud)

因此,我们现在针对给定值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
Run Code Online (Sandbox Code Playgroud)

现在您可以在tr命令中轻松使用它

echo "hello" | tr "${source[*]}" "${trans[*]}"
jgnnq
Run Code Online (Sandbox Code Playgroud)

您只需将其全部放入函数中,然后将其值打印为

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"
}
Run Code Online (Sandbox Code Playgroud)

一些测试

transChar "hello" 1
ifmmp

transChar "hello" 2
jgnnq

transChar "hello" 3
khoor
Run Code Online (Sandbox Code Playgroud)