Bash-Skript zeilenweise lesen

Bash-Skript zeilenweise lesen

Hallo, ich versuche, ein Skript zu erstellen, das meine Datei liest, alle benötigten Variablen nimmt und sie dann für einen anderen Befehl verwendet. Aber es scheint, dass die Variablen nicht gespeichert werden, denn ich habe ein printf versucht, anstatt mein Skript auszuführen, und habe eine leere Ausgabe erhalten.

hier ist mein Code

#!/bin/bash
numparams=$#
params=$*
cat tots.txt | while read;
do  awk '{
regid=$1;
uport=$2;
ongoingcalls=$3;
ingeg=$4;
maxcalls=$5;
if($3<$5) state=0
if($3==$5) state=1
if($3>$5) state=2
}'
/home/send_script.sh -o "$regid $uport $ongoingcalls $ingeg $maxcalls $state"
done

Und hier ist der Inhalt von tots.txt:

Bildbeschreibung hier eingeben

Antwort1

Dies liegt daran, dass Ihre Variablen in der Subshell festgelegt werden, die Sie mit öffnen cat <file> | while .... Wenn diese Subshell also fertig ist, können Sie nicht mehr auf diese Variablen zugreifen.

Sagen Sie stattdessen:

while read; do
    ...
done < tots.txt

Interessante Lektüre:Ich setze Variablen in einer Schleife, die sich in einer Pipeline befindet. Warum verschwinden sie, wenn die Schleife beendet ist? Oder warum kann ich Daten zum Lesen nicht weiterleiten?.

Beachten Sie auch, dass Sie anscheinend eine gewisse Verwechslung zwischen awkund shellVariablen haben. Was auch immer Sie in festlegen, awkbleibt dort, daher awk '{$var=2}'ist die Aussage zweimal falsch: Variablen in awk werden ohne das festgelegt $( $varbezieht sich auf die Spaltennummer var) und dann ist die Variable nur im Gültigkeitsbereich von awkund in Ihrer Shell nicht verfügbar.

Vielleicht möchten Sie etwas tun wie:

results=($(awk 'BEGIN {print 1,2,3,"a"}'))

Damit erstellen Sie ein Array results[], auf das Sie später zugreifen können.

verwandte Informationen