So übergeben Sie dynamische Variablen in einer MySQL-Abfrage mithilfe eines Shell-Skripts

So übergeben Sie dynamische Variablen in einer MySQL-Abfrage mithilfe eines Shell-Skripts

Dies ist der Teil meines Codes:

sample_1=''
sample_1_is_cancelled=''
sample_2=''
sample_2_is_cancelled=''
sample_3=''
sample_3_is_cancelled=''
sample_4=''
sample_4_is_cancelled=''
sample_5=''
sample_5_is_cancelled=''

while read -r insert
do
 eval sample_$i=$(echo $insert| awk -F'|' '{print $1}')
 eval sample_$i_is_cancelled=$(echo $insert| awk -F'|' '{print $2}')
         i=$(( i + 1 ))
         
         done < $logpath/source.txt

mysql -uroot -p -e" insert into ttable(sample_1, sample_1_is_cancelled, sample_2, sample_2_is_cancelled, sample_3, sample_3_is_cancelled, sample_4, sample_4_is_cancelled, sample_5, sample_5_is_cancelled)
                values($sample_1, $sample_1_is_cancelled, $sample_2 $sample_2_is_cancelled, $sample_3, $sample_3_is_cancelled, $sample_4, $sample_4_is_cancelled, $sample_5, $sample_5_is_cancelled);"

Es sind maximal 5 Wertesätze möglich. Das Minimum ist ein Satz.

Ich kann die Variablen wie unten wiedergeben,

eval echo \$sample_$i
eval echo \$sample_${i}_is_cancelled

Aber ich kann es nicht auf die gleiche Weise neben der Einfügeabfrage übergeben. Irgendwelche Vorschläge? Bitte helfen Sie.

Antwort1

Hier ist ein Beispiel, wie dies mit zwei Arrays („Felder“ und „Werte“) funktioniert.

#!/bin/bash

declare -a fields values

infile="./source.txt"
#infile="$logpath/source.txt"

i=0
while read -r insert; do
  # split "$insert" into a and b, using | as delimiter
  a="${insert%|*}"
  b="${insert#*|}"

  # create the field names from the loop counter $i
  let i++
  sfield="sample_$i"
  cfield="sample_${i}_is_cancelled"

  fields+=("$sfield" "$cfield")
  values+=("$a" "$b")
done < "$infile"


# show what's in the arrays:
declare -p fields
echo
declare -p values

# now build the SQL string, in parts:

# field names don't need to be quoted
f=$(printf "%s, " "${fields[@]}" | sed -e 's/, $//')

# this assumes values are strings and need to be quoted
v=$(printf "'%s', " "${values[@]}" | sed -e 's/, $//')

sql="$(printf "insert into ttable(%s) values (%s);" "$f" "$v")"

echo
echo "mysql -uroot -p -e \"$sql\""

Gegeben sei die folgende sources.txtDatei:

$ cat source.txt 
one|two
three|four
foo|bar
junk|more junk

Durch Ausführen des Skripts wird die folgende Ausgabe erzeugt:

declare -a fields=([0]="sample_1" [1]="sample_1_is_cancelled" [2]="sample_2" 
  [3]="sample_2_is_cancelled" [4]="sample_3" [5]="sample_3_is_cancelled"
  [6]="sample_4" [7]="sample_4_is_cancelled")

declare -a values=([0]="one" [1]="two" [2]="three" [3]="four"
  [4]="foo" [5]="bar" [6]="junk" [7]="more junk")

mysql -uroot -p -e "insert into ttable(sample_1, sample_1_is_cancelled, sample_2,
  sample_2_is_cancelled, sample_3, sample_3_is_cancelled,
  sample_4, sample_4_is_cancelled) values ('one', 'two', 'three', 'four',
  'foo', 'bar', 'junk', 'more junk');"

(Zeilenumbrüche und Einrückungen zur besseren Lesbarkeit hinzugefügt)


HINWEIS: Wenn Sie mehr mit den Feldnamen oder den Werten im Shell-Skript selbst machen müssten (also mehr, als es nur in einer SQL-Insert-Anweisung zu verwenden), wären Sie wahrscheinlich besser dran, wenn Sie zwei assoziative Arrays verwenden (eines für Samples und eines für abgebrochene Samples) und die Variablen $sfield und $cfield als Schlüssel für diese Arrays verwenden. Ich begann das Skript auf diese Weise zu schreiben, erkannte dann aber, dass es für die Aufgabe zu kompliziert war (und mehr Arbeit erfordert hätte, um die Felder und Werte zum Erstellen der SQL-Zeichenfolge zusammenzuführen), also vereinfachte ich es, indem ich nur die indizierten Arrays $fields und $values ​​verwendete.

verwandte Informationen