Author

Topic: Verständnisproblem mit SH Scripten (Read 849 times)

legendary
Activity: 986
Merit: 1027
Miner-Control.de Pooler
May 07, 2016, 08:03:17 AM
#4
HY!

Besten DANK! Da bin ich nun einen Schritt weiter!
Das erklärt auch einiges. Zb. das die Leute bei UNOMP etliches undokumentiert haben.

Profitpool bewerben, aber nichts passenden geliefert, bzw. alles offen gelassen.... grausam.

legendary
Activity: 2380
Merit: 1085
Money often costs too much.
May 06, 2016, 10:51:21 PM
#3
Code:
function breakpoint()
{
    local CHARACTER
    echo -en "press [Enter] to continue"
    read -r -s -n 1 CHARACTER ;# read 1 byte
    if [[ ! $CHARACTER =~ \n ]]; then echo; fi
}

Kann man auch mit dem Ellenbogen auf SPACE, Hand unter dem Kinn durchkloppen

Code:
#use:
#vardump variablename1 variablename2 variablename3
function vardump()
{
    local var value
    while [ $# -gt 0 ]; do
        var="$1"
        value=$(eval "echo \$${var}")
        shift
        echo "DEBUG $var=$value"
    done
}
legendary
Activity: 2380
Merit: 1085
Money often costs too much.
May 06, 2016, 10:47:18 PM
#2

tip mal in der shell "help read" ein dann siehst du das dort die Variablennamen folgen die mit den Zeilen aus
Code:
done< <(/usr/local/bin/redis-cli hkeys Coin_Algos)
gefüttert werden. Das
Code:
<<()
Konstrukt ist spezifisch für die Bash, wenn du das Script mit "sh script" aufrufst läuft das vor die Wand weil sich dann das gleiche Shell Binary anders/Kompatibel verhält. Oh da war etwas, da bin ich mir grad nicht sicher. /bin/sh ist hoffnungslos veraltet, da gibt es keine
Code:
[[ =~ ]]
regexp Vergleiche, da ist sogar teils noch [ ein Softlink /usr/bin/[ der auf /bin/test zeigt etc.

Quote
"while read CoinName"
CoinName is empty...
^^ nein ist es nicht, CoinName ist die Variable die bei jedem while Durchlauf mit der nächsten Zeile aus redis-cli hkeys Coin_Names_"$line" gefüttert. Wenn es leer bleibt, dann kommt aus redis-cli kein Output heraus.
Code:
done< <(/usr/local/bin/redis-cli hkeys Coin_Names_"$line")

Shell Scripte debuggen ist ätzend. Versuche dir die Variableninhalte auszugeben,
Code:
while read WorkerName
do
    echo "DEBUG: WorkerName = $WorkerName"

und dann den ganzen Output in ein file geben, bash script.sh |& tee logfile.txt
Du kannst dir auch Breakpoints basteln, habe dafür so ein ~/bin/breakpoint.sh das macht etwas leicht anderes, davon brauchst du eher den echo press enter; read -r -s -n 1 CHR Teil. Pack dir das in eine function() im gleichen Script, oder bastell dir ein debug.sh mit den functions für Variableninhalte auszugeben und Breakpoints setzen.

Code:
#!/bin/sh

#exec quoted
"$@"
res=$? ;# and store error condition

if [ $res -ne 0 ]; then
  echo "command FAILED with error"
fi

#wait for user, our purpose
echo -en "\n...press [Enter] to continue"
read -r -s -n 1 CHARACTER ;# read 1 byte

if [ $res -ne 0 ]; then
  #exec /usr/bin/false
  exit $res ;# hand over error condition value
fi


Code:
now="$(date +"%s")"
braucht kein Escaping, der output von /usr/bin/date dürfte kein Element aus IFS enthalten. Solltest aber besser PATH absichern falls da Überaschungen aufwarten.

Code:
length=$(echo "$endtime - $starttime" | bc -l)
braucht dann auch keinen Unterprozess /usr/bin/bc forken, die Integerarithmetik kann die Shell selbst,
Code:
length=$[$endtime - $starttime]

okay, bei dayslength geht es in die Fliesskommarithmetik mit 3 Nachkommastellen da ist das Konstrukt okay.
legendary
Activity: 986
Merit: 1027
Miner-Control.de Pooler
May 06, 2016, 02:38:12 PM
#1
Moin Moin,

ich habe ein leichtes Verständnisproblem mit einem oder mehreren *.sh Scripten unter Linux, Ubuntu.

Und zwar mit "while read" schleifen.

ich habe mehrere Scripte in denen diese Schleifen eingebaut sind. Allerdings wird vor der Schleife nicht definiert, was in dieser Schleife ist.
Also nicht wie z.b. bei einem Array oder so, in der Schleife wird zwar auf auf die Definition zugegriffen, aber nie gefüllt.

Also, woher weiß das Script was dort gesetzt werden muss?


Hier das Script: https://github.com/UNOMP/unified-node-open-mining-portal/issues/109

Ich hoffe jemand kann mich erleuchten Wink *gg*
Jump to: