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但这不起作用。我想念什么吗?
你所要做的不能用做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)