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.txt
Datei:
$ 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.