我正在为乐趣而努力,这是我在Shell脚本编写过程中学习过程的一部分。
假设我有初始输入A B C
我要做的是拆分字符串并将每个字符串转换为十进制值。
A B C = 65 66 67
然后我将十进制值添加到随机数,比如说数字1。
现在,十进制值将变为= 66 67 68
最后,我将再次将小数转换为原始值,这将成为B C D
ubuntu@Ubuntu:~$ cat testscript.sh -n
#!/bin/bash
1 string="ABC"
2
3 echo -e "\nSTRING = $string"
4 echo LENGTH = ${#string}
5
6 # TUKAR STRING KE ARRAY ... word[x]
7 for i in $(seq 0 ${#string})
8 do word[$i]=${string:$i:1}
9 done
10
11 echo -e "\nZero element of array is [ ${word[0]} ]"
12 echo -e "Entire array is [ ${word[@]}] \n"
13
14 # CHAR to DECIMAL
15 for i in $(seq 0 ${#string})
16 do
17 echo -n ${word[$i]}
18 echo -n ${word[$i]} | od -An -tuC
19 chardec[$i]=$(echo -n ${word[$i]} | od -An -tuC)
20 done
21
22 echo -e "\nNEXT, DECIMAL VALUE PLUS ONE"
23 for i in $(seq 0 ${#string})
24 do
25 echo `expr ${chardec[$i]} + 1`
26 done
27
28 echo
这是输出
ubuntu@Ubuntu:~$ ./testscript.sh
STRING = ABC
LENGTH = 3
Zero element of array is [ A ]
Entire array is [ A B C ]
A 65
B 66
C 67
NEXT, DECIMAL VALUE PLUS ONE
66
67
68
1
正如您在输出中看到的,有2个问题(或者更多)
for
循环处理附加号码。知道怎么解决这个问题吗?NEXT, DECIMAL VALUE PLUS ONE 66 67 68 1
ubuntu@Ubuntu:~$ printf "\x$(printf %x 65)\n" A
请告知
答案 0 :(得分:3)
使用bash
,您可以使用以下代码替换所有代码:
for i; do
printf "\x"$(($(printf '%x' "'$i'") +1))" "
done
echo
当您将其作为:
运行时./testscript.sh P Q R S
它将打印:
Q R S T
答案 1 :(得分:1)
awk
救援!
在 awk
环境中执行相同操作更简单。
$ echo "A B C" |
awk 'BEGIN{for(i=33;i<127;i++) o[sprintf("%c",i)]=i}
{for(i=1;i<=NF;i++) printf "%c%s", o[$i]+1, ((i==NF)?ORS:OFS)}'
B C D
答案 2 :(得分:1)
seq是从FIRST到LAST,所以如果你的字符串长度是3,那么seq 0 3将给你&lt; 0,1,2,3&gt;。你的倒数第二个循环(第16-20行)实际上是运行了四次迭代,但最后一次迭代没有打印任何内容。
要打印ascii代码,请将其插入内联,例如
printf "\x$(printf %x `expr ${chardec[$i]} + 1`) "
或更可读:
dec=`expr ${chardec[$i]} + 1`
printf "\x$(printf %x $dec)\n"