Shell脚本:数组中的算术运算

时间:2017-11-03 21:19:36

标签: bash shell

我正在为乐趣而努力,这是我在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个问题(或者更多)

  1. 最后一个for循环处理附加号码。知道怎么解决这个问题吗?
  2. NEXT, DECIMAL VALUE PLUS ONE
    66
    67
    68
    1
    
    1. 这是将十进制值转换为char的公式。我正在尝试将最后一个值放到另一个数组中,然后将其放在另一个循环中以实现此目的。但是,我仍然不知道如何根据以前的数据在循环中执行此操作。
    2. ubuntu@Ubuntu:~$ printf "\x$(printf %x 65)\n"
      A
      

      请告知

3 个答案:

答案 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"