Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
Spike1986
- Beiträge: 153
- Registriert: 25.01.2012 20:16:47
Beitrag
von Spike1986 » 06.03.2014 19:10:20
Habe ein Shell-Script (.sh) für ein Receiver seit dem Update erhalte ich die Meldung.
Code: Alles auswählen
for (( pos=0 ; pos<strlen ; pos++ )); do
c=${string:$pos:1}
case "$c" in
[-_.~a-zA-Z0-9] ) o="${c}" ;;
* ) printf -v o '%%%02x' "'$c"
esac
encoded+="${o}"
done
echo "${encoded}"
REPLY="${encoded}"
da erhalte ich die Fehlermeldung "syntax error: bad for loop variable" line 136
line 136 ist:
-
peschmae
- Beiträge: 4844
- Registriert: 07.01.2003 12:50:33
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: nirgendwo im irgendwo
Beitrag
von peschmae » 06.03.2014 21:12:39
Seit welchem update? Debian hat mal den Symlink auf /bin/sh umgebogen von bash nach dash (die ist etwas weniger fett als bash, und etwas posix-standardkonformer oder sowas in die Richtung). Das ist allerdings schon eine Weile her - gefühlt ein paar Jahre. Dash kennt vermutlich dieses for-loop Konstrukt nicht.
Du könntest also statt /bin/sh explizit /bin/bash verwenden. Oder stattdessen auf for pos in $(seq 0 $strlen); do ... umsteigen.
MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy
-
Cae
- Beiträge: 6349
- Registriert: 17.07.2011 23:36:39
- Wohnort: 2130706433
Beitrag
von Cae » 07.03.2014 00:18:05
(( ... )) ist Bash-Syntax, daran kann's schon mal liegen. Umstieg auf
/bin/sh ist nicht moeglich, da
${ac} und
a+=b ebenfalls Bashismen sind.
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
-
Spike1986
- Beiträge: 153
- Registriert: 25.01.2012 20:16:47
Beitrag
von Spike1986 » 07.03.2014 00:35:14
Mhh okay. Habe gerade was gelesen das es sich um ein Bash handelt.
Kenn mich mit Scripten nicht so aus dann muss ich eine Alternative Suchen.
Danke schonmal
Edit:
Habe mal was probiert.
Code: Alles auswählen
# Vorbereitung fuer http Ausgabe auf Receiver
urlencode() {
if [ "$1" = alle ]; then
string="$list"
fi
if [ "$1" = eins ]; then
string="$LIST"
fi
if [ "$1" = alte ]; then
string="$BQv"
fi
if [ "$1" = bq ]; then
string="Senderlisten-Update/Installation"
fi
if [ "$1" = apps ]; then
string="APPS-Update/Installation"
fi
if [ "$1" = cron ]; then
string="Cron-Update/Installation"
fi
if [ "$1" = scripte ]; then
string="Scripte-Update/Installation"
fi
if [ "$1" = uptime ]; then
string="$uptime"
fi
args=$(echo "$string" | sed -e 's/%/%25/g' -e 's/ /%20/g' -e 's/!/%21/g' -e 's/"/%22/g' -e 's/#/%23/g' -e 's/\$/%24/g' -e 's/\&/%26/g' -e 's/'\''/%27/g' -e 's/(/%28/g' -e 's/)/%29/g' -e 's/\*/%2a/g' -e 's/+/%2b/g' -e 's/,/%2c/g' -e 's/-/%2d/g' -e 's/\./%2e/g' -e 's/\//%2f/g' -e 's/:/%3a/g' -e 's/;/%3b/g' -e 's//%3e/g' -e 's/?/%3f/g' -e 's/@/%40/g' -e 's/\[/%5b/g' -e 's/\\/%5c/g' -e 's/\]/%5d/g' -e 's/\^/%5e/g' -e 's/_/%5f/g' -e 's/`/%60/g' -e 's/{/%7b/g' -e 's/|/%7c/g' -e 's/}/%7d/g' -e 's/~/%7e/g')
}
GUIneustart() {
wget -O /dev/null "http://localhost:80/web/message?text=$( urlencode $1 "$args" )%20fertig!%20Soll%20Receiver%20neu%20gestartet%20werden?%20$( urlencode $1 "$args" )%20erst%20nach%20neu%20start%20verfügbar!&type=0"
}
GUIneustart apps
Muss das aber noch testen
-
Spike1986
- Beiträge: 153
- Registriert: 25.01.2012 20:16:47
Beitrag
von Spike1986 » 07.03.2014 19:12:57
So habe jetzt ein 90% Lösung gefunden.
Nur habe ich das Problem wenne die uptime Variable z.b "06.03.2014 um 16:59" ist wird diese nicht angezeigt.
Code: Alles auswählen
urlencode() {
if [ "$1" = alle ]; then
string="$list"
fi
if [ "$1" = eins ]; then
string="$LIST"
fi
if [ "$1" = alte ]; then
string="$BQv"
fi
if [ "$1" = bq ]; then
string="Senderliste-Update/Installation"
fi
if [ "$1" = apps ]; then
string="APPS-Update/Installation"
fi
if [ "$1" = cron ]; then
string="Cron-Update/Installation"
fi
if [ "$1" = scripte ]; then
string="Scripte-Update/Installation"
fi
if [ "$1" = uptime ]; then
string="$uptime"
fi
local arg
arg="$string"
while [[ "$arg" =~ ^([0-9a-zA-Z/:_\.\-]*)([^0-9a-zA-Z/:_\.\-])(.*) ]] ; do
echo -n “${BASH_REMATCH[1]}”
printf “%%%X” “‘${BASH_REMATCH[2]}’”
arg=”${BASH_REMATCH[3]}”
done
# the remaining part
#echo -n “$arg”
}
-
Cae
- Beiträge: 6349
- Registriert: 17.07.2011 23:36:39
- Wohnort: 2130706433
Beitrag
von Cae » 07.03.2014 22:06:03
Die ganzen Ticks und Anfuehrungzeichen bei printf und Umgebung sind keine ASCII-Ticks/Anfuehrungszeichen, sondern die typografisch korrekten Unicode-Entsprechungen. Vermutlich hat sie ein (ungeeigeneter) Editor eingefuegt; die Shell kann damit jedenfalls nichts anfangen.
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
-
Spike1986
- Beiträge: 153
- Registriert: 25.01.2012 20:16:47
Beitrag
von Spike1986 » 07.03.2014 22:13:44
Cae hat geschrieben:Die ganzen Ticks und Anfuehrungzeichen bei printf und Umgebung sind keine ASCII-Ticks/Anfuehrungszeichen, sondern die typografisch korrekten Unicode-Entsprechungen. Vermutlich hat sie ein (ungeeigeneter) Editor eingefuegt; die Shell kann damit jedenfalls nichts anfangen.
Gruss Cae
Hört sich kompliziert an. Habe denn urlencode bei einer google suche gefunden.
-
Spike1986
- Beiträge: 153
- Registriert: 25.01.2012 20:16:47
Beitrag
von Spike1986 » 07.03.2014 23:52:16
Spike1986 hat geschrieben:Cae hat geschrieben:Die ganzen Ticks und Anfuehrungzeichen bei printf und Umgebung sind keine ASCII-Ticks/Anfuehrungszeichen, sondern die typografisch korrekten Unicode-Entsprechungen. Vermutlich hat sie ein (ungeeigeneter) Editor eingefuegt; die Shell kann damit jedenfalls nichts anfangen.
Gruss Cae
Hört sich kompliziert an. Habe denn urlencode bei einer google suche gefunden.
Edit: Lösung
Code: Alles auswählen
if [ ! -x "/usr/bin/hexdump" ]; then
echo "hexdump not found, nutze sed Befehl"
encodedurl=$(echo "$string" | sed 's/ /%20/g;s/!/%21/g;s/"/%22/g;s/#/%23/g;s/\$/%24/g;s/\&/%26/g;s/'\''/%27/g;s/(/%28/g;s/)/%29/g;s/:/%3A/g')
else
encodedurl=`
echo $string | hexdump -v -e '1/1 "%02x\t"' -e '1/1 "%_c\n"' |
LANG=C awk '
$1 == "20" { printf("%s", "+"); next } # space becomes plus
$1 ~ /0[adAD]/ { next } # strip newlines
$2 ~ /^[a-zA-Z0-9.*()\/-]$/ { printf("%s", $2); next } # pass through what we can
{ printf("%%%s", $1) } # take hex value of everything else
'`
fi
echo "${encodedurl}"
REPLAY="${encodedurl}"