2017-11-03 1 views
0

Ich mache zum Spaß und dies als Teil meines Lernprozesses in Shell-Skripts.Shell-Skript: Arithmetische Operation in Array

Lassen Sie sagen, ich habe Ersteingabe A B C

Was ich zu tun ist, ich versucht, die Zeichenfolge und konvertieren jedes von ihnen Dezimalwert aufzuspalten.

A B C = 65 66 67 

Dann werde ich den Dezimalwert auf Zufallszahl hinzufügen, sagen wir mal die Nummer 1.

Nun wird Dezimalwert werden = 66 67 68

Schließlich werde ich die Dezimalstelle auf die konvertieren ursprünglicher Wert wieder die B C D

[email protected]:~$ 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 

Dies ist die Ausgabe

werden wird

Wie Sie in der Ausgabe sehen können, gibt es zwei Probleme (oder vielleicht mehr)

  1. Die letzte for Schleifenverarbeitung zusätzliche Nummer. Irgendeine Idee, wie man das repariert?
NEXT, DECIMAL VALUE PLUS ONE 
66 
67 
68 
1 
  1. Dies ist die Formel Dezimalwert zu umwandeln verkohlen. Ich versuche, den letzten Wert zu einem anderen Array zu legen und ihn dann in eine andere Schleife zu legen. Ich habe jedoch immer noch keine Ahnung, wie man dies in einer Schleife basierend auf vorherigen Daten macht.
[email protected]:~$ printf "\x$(printf %x 65)\n" 
A 

Bitte geben

+2

Wenn Sie mit 'bash' dann kann dieses Skript viel – anubhava

+1

Recht vereinfacht werden sicher, es ist Bash, wenn man die Existenz von Arrays in Betracht zieht, nein? –

+0

@anubhava, yup Ich benutze Bash Shell. Das erste Skript war sehr manuell ohne "loop" Dies ist mein erster Versuch, es zu vereinfachen. –

Antwort

3

bash Verwenden Sie alle Ihre Code mit diesem Code ersetzen:

for i; do 
    printf "\x"$(($(printf '%x' "'$i'") +1))" " 
done 
echo 

Wenn Sie führen Sie es als:

./testscript.sh P Q R S 

Es druckt:

Q R S T 
+0

'für i;' scheint keine Werte zu haben, um 'i' zu setzen. – agc

+1

Das ist nicht korrekt. 'für mich'; ist äquivalent zu 'für i in" $ @ ";' – anubhava

+0

@CharlotteRussell: Hat das geklappt? – anubhava

1

awk zur Rettung!

einfacher zu tun, das gleiche in awk Umgebung.

$ 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 
1

seq ist von FIRST, LAST also, wenn Ihr String-Länge 3 ist, dann Seq 0 3 geben Ihnen < 0,1,2,3>. Ihre vorletzte Schleife (Zeilen 16-20) führt tatsächlich vier Iterationen durch, aber die letzte Iteration gibt nichts aus.

den ASCII-Code printf, legen Sie sie inline, wie

printf "\x$(printf %x `expr ${chardec[$i]} + 1`) " 

oder mehr leserlich:

dec=`expr ${chardec[$i]} + 1` 
printf "\x$(printf %x $dec)\n" 
Verwandte Themen