2012-03-29 6 views
2

Unten ist mein Code, der extrem bizarr verhält, und ich bin nicht sicher, ob ich den Grund verstehen, aber ich denke, es ist irgendwie Weg Expansion verbunden ist:Doppelpunkte, gleich, Et-Zeichen in Argumente

EDIT: dieser in der zweiten Auflistung ist das asxgrab Skript erwähnt:

#!/usr/bin/env bash 

let "i=0" 

GET "$1" | grep 'href="mms://' | while read line 
do 
    echo "$line" 
    address=`echo $line | grep -Eow '"[^"]+"'` 
    address_length=$((${#address}-2)) 
    address=${address:1:address_length} 
    echo "Grabbing '$address', attempt $i, $address_length" 
    mplayer "'$address' -dumpstream -dumpfile '$2.wmv' -vf scale\=320\:240" > /dev/null 
    if [ ! $? ]; then 
     break 1 
    fi 
    let "i++" 
done 

ich Dutzende von verschiedenen Möglichkeiten zu entkommen, zitiert und so weiter ausprobiert habe, und ich glaube, ich meine Kreativität erschöpft habe ... bitte helfen!

Angenommen, das Skript mit diesen Argumenten aufgerufen:

./asxgrab 'http://switch3.castup.net/cunet/gm.asp?ai=16&ip=79.180.37.230&course=c20478/2012b&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&ar=c20478_12b_784_01_1&ticket=58353E7A69BF1B9XO655E9E683016C5255C08DD37211ECF495F72A64E5278AA434CSP3C10C028D604AAD6C39FE7D71386D230983BBAF58A2511D14222F95090AE2C4C55CB696B82919A5A8EB44EAF8954DEDB5' 'java.0' 

Die empfangene Antwort wie folgt aussieht:

<asx version="3.0"> 
    <!-- GMX --> 
    <param name="encoding" value="utf-8" /> 
    <title>CastUP: c20478_12b_784_01_1</title> 
    <MOREINFO HREF = "" /> 

    <entry> 
    <PARAM NAME="EntryType" VALUE="Content" /> 

    <param name="encoding" value="utf-8" /> 
    <PARAM NAME="CastUP_AssociatedURL" VALUE="" /> 
    <PARAM NAME="CastUP_Content_Config" VALUE="" /> 
    <PARAM NAME="CastUP_Content_ClipMediaID" VALUE="9067325" /> 
    <author>openu</author> 
     <title>CastUP: c20478_12b_784_01_1</title> 
<ref href="mms://s3fwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=FE81687B-33CD-4441-A8F6-1DEC9923332C&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183" /> 
<ref href="...." /> 

    </entry> 

Wenn ich dies tun:

mplayer "mms://s3fwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=C6527A33-587F-4148-A3D2-E7EDED51316B&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183" -dumpstream -dumpfile java0.wmv -vf scale=320:240 

vom Terminal, es funktioniert, aber es funktioniert nicht vom Skript. Stattdessen versucht es, dieoder etwas ähnliches zu trimmen. Ich verstehe auch nicht, was passiert, aber der Ausgang ist absolut keine Folgen ...

Diese Seite meiner Uni ist und das ist, lustig, wie es erhält, einen Vortrag über Java :)

EDIT :

<ref href="mms://s0dwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=111A3770-29DC-40EC-85EC-93453E2819D7&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183" /> 
Grabbing 'mms://s0dwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=111A3770-29DC-40EC-85EC-93453E2819D7&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183', attempt 0, 268 
Can't open joystick device /dev/input/js0: No such file or directory 
Can't init input joystick 
mplayer: could not connect to socket 
mplayer: No such file or directory 
Failed to open LIRC support. You will not be able to use your remote control. 
No stream found to handle url 'mms://s0dwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=111A3770-29DC-40EC-85EC-93453E2819D7&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183' -dumpstream -dumpfile 'java.0.wmv' -vf scale=320:240 
d324d1043027b0720c295b93e4abb183" /> 
Grabbing '', attempt 1, -2 
Can't open joystick device /dev/input/js0: No such file or directory 
Can't init input joystick 
mplayer: could not connect to socket 
mplayer: No such file or directory 
Failed to open LIRC support. You will not be able to use your remote control. 
File not found: ''' -dumpstream -dumpfile 'java.0.wmv' -vf scale=320:240' 
Failed to open '' -dumpstream -dumpfile 'java.0.wmv' -vf scale=320:240. 
027b0720c295b93e4abb183" /> 

Dies ist die Ausgabe von dem Skript ich erhalte.

MPlayer SVN-r31918 (C) 2000-2010 MPlayer Team 
Can't open joystick device /dev/input/js0: No such file or directory 
Can't init input joystick 
mplayer: could not connect to socket 
mplayer: No such file or directory 
Failed to open LIRC support. You will not be able to use your remote control. 

Playing mms://s3fwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=C6527A33-587F-4148-A3D2-E7EDED51316B&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183. 
STREAM_ASF, URL: mms://s3fwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=C6527A33-587F-4148-A3D2-E7EDED51316B&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183 
Resolving s3fwm.castup.net for AF_INET6... 

Couldn't resolve name for AF_INET6: s3fwm.castup.net 
Resolving s3fwm.castup.net for AF_INET... 
Connecting to server s3fwm.castup.net[212.179.13.65]: 1755... 

Connected 
file object, packet length = 6100 (6100) 
unknown object 
unknown object 
unknown object 
stream object, stream ID: 1 
stream object, stream ID: 2 
unknown object 
data object 
mmst packet_length = 6100 
Cache size set to 64 KBytes 
Stream not seekable! 

Und das ist die erwartete Ausgabe. richtig

+2

Sie kein einziges Wort sagen, was hat es tun sollte :-) ich in der Lage war zu entziffern, dass Sie gelesen eine Datei (was ./asxgrab tut), dann wirfst du diese Textdatei in dein Skript, das die Zeilen mit 'href =" mms: // 'dann iteriert durch die übereinstimmenden Zeilen. – karatedog

+1

Führe das' echo "$ line" ' und echo "Grabbing $ address", Versuch $ i, $ address_length "' Befehle drucken, was Sie erwarten? – ruakh

+0

Okay, aber wie ich verstehe, das Problem ist, wie Sie die Video-URL aus der Asx-Datei richtig zu extrahieren, die Sie wollen Wirf zu 'mplayer' (wie du geschrieben hast, funktioniert es vom Terminal, aber nicht vom Skript) – karatedog

Antwort

2

Haben Sie das versucht?

mplayer "$address" -dumpstream -dumpfile "$2.wmv" -vf "scale=320:240" > /dev/null 

Secrets of bash:

  • Variablen in doppelte Anführungszeichen werden erweitert; diejenigen in einfachen Anführungszeichen sind nicht.
  • Wörter in Anführungszeichen werden als ein einzelnes Token behandelt.
  • Zitate eines Typs entgehen denen des anderen Typs.

Die ursprüngliche Linie

mplayer "'$address' -dumpstream -dumpfile '$2.wmv' -vf scale\=320\:240" > /dev/null 

genannt mplayer mit dem einzigen Argumente '$address' -dumpstream -dumpfile '$2.wmv' -vf scale\=320\:240, aber mplayer will diese Token jeweils ein separates Wort sein.

+0

@wvxvw: Aber die Anführungszeichen um 'scale = 320: 240' haben keine Wirkung; Es muss noch etwas geben, das du vorher vermisst hast. : -/ – ruakh

+2

ein anderer auf GREP: grep ist ein Linienwerkzeug, was bedeutet, wenn Sie eine 2 TB Datei haben und Sie 'grep' es, werden Sie sofort wieder Matches bekommen, wenn es welche gibt, müssen Sie nicht warten für die gesamte Datei verarbeitet werden. Dies bedeutet, dass grep jeweils 1 Zeile zurückgibt, so dass der Block "while read line" nicht benötigt wird (da er eine einzeilige Texteingabe verarbeiten wird). – karatedog

+1

@wvxvw: Sie haben jetzt ein funktionierendes Skript, oder? Nun, versuchen Sie '' scale = 320: 240 "' zurück zu 'scale = 320: 240' zu ändern (wie in meiner Antwort), und Sie werden feststellen, dass es immer noch funktioniert. Sie müssen gleichzeitig etwas anderes geändert haben. – ruakh

2

Wenn ich alles bin zu verstehen, ist die einzige wirkliche Problem, das ich sehe, dass diese Zeile:

mplayer "'$address' -dumpstream -dumpfile '$2.wmv' -vf scale\=320\:240" > /dev/null 

soll diese sein:

mplayer "$address" -dumpstream -dumpfile "$2.wmv" -vf scale=320:240 > /dev/null 

Das heißt, müssen Sie entfernen die doppelten Anführungszeichen, die alle Argumente von mplayer zu einem einzigen Argument zusammenfassen, und Sie müssen die einfachen Anführungszeichen und einige dieser Argumente entfernen.

Andere Dinge, die ich könnte für Sauberkeit ändern willen:

  • Wechsel read line zu read -r line würden jede mögliche Seltsamkeit von Schrägstrichen beseitigen.
  • eine Linie line="${line%$'\r'}" am Anfang der while -loop Körper würde jede Sorge über streunende Wagen-Rückkehr ruhen legen.
  • ändern address=`echo $line ... zu address=`echo "$line" ... würde jedes Risiko der Worttrennung und Dateinamen-Erweiterung und was nicht auszuschließen (nicht, dass sie sehr wahrscheinlich so erscheinen, wie es ist).
  • der [ ! $? ] Test ist bedeutungslos (seit $? ist nie leer, oder?); es am Ende des vorherigen Befehls zu nur && break 1 ändern wäre klarer IMHO und effektiver.
+1

@wvxvw: Nein, das ist nicht wie '[! ...] 'funktioniert. Probiere 'if [! ...]; dann echo foo; sonst Echo-Balken; fi' für verschiedene Werte von '...', wie zB '0' und' 1'. Sie werden feststellen, dass es immer "bar" druckt. Die einzige Zeit, in der "foo" gedruckt wird, ist, wenn "..." leer ist (die leere Zeichenfolge); zum Beispiel, 'wenn [! '']; dann echo foo; fi' wird 'foo' drucken. – ruakh

+1

@wvxvw: Bash repräsentiert Booleans auf verschiedene Arten. . . es ist eigentlich ziemlich kompliziert. Im Allgemeinen sollte ein Befehl mit einem Exit-Status enden, der anzeigt, ob er erfolgreich war: "0" für Erfolg, ungleich Null für Fehler. Boolesche Dinge verwenden "Erfolg" als "wahr" und "Fehler" als "falsch", also etwas wie "if foo; dann bar; sonst baz; fi' wird 'bar' laufen lassen, wenn' foo' '0' zurückgibt (" success/true ") und' bar' wenn 'foo' nicht-null (" error/false ") zurückgibt. (Diese Art von Logik wird von 'if',' while', '&&', '||', '!' Usw.) verwendet. * [Fortsetzung] * – ruakh

+0

@wvxvw: * [Fortsetzung] * Folglich und umgekehrt , gibt es eine Reihe von Befehlen, die wirklich für die Verwendung mit "if" usw. ausgelegt sind, die "Erfolg" zurückgeben, wenn sie "wahr" und "Fehler" bedeuten, wenn sie "falsch" bedeuten.Zum Beispiel wird '[" $ a "= a]' '0' zurückgeben ("success/true"), wenn '$ a'' a' ist, und andernfalls ein Wert ungleich Null ("error/false"). So passt alles zusammen, Hand in Hand. Bist du so weit bei mir? Beachten Sie jedoch, dass '[]' der grundlegende Test, wenn Sie keinen anderen Test angeben, ist, es überprüft nur, ob es ein nicht leeres Argument hat; und '' negiert das. * [fortgesetzt] * – ruakh

1

Sie Bash-Skript ist sehr "Imperativ", wie es von Assembly neu geschrieben wurde.

Ein anderer Ansatz:

  • die Deskriptordatei
  • sauber die Deskriptordatei erhalten (mms verlassen: // ... Strings in it)
  • Verwendung, die
  • Ergebnis als Eingabe für die zyklische Bearbeitung gereinigt

Dies war ein One-Liner, ich breche es einfach auf. Sie würden den Code zwischen dem do..done setzen. Ich kümmerte sich nicht um die Dateinamen ginormous zu sein, ich gab ihnen als Ausgabe .wmv:

link="http://switch3.castup.net/cunet/gm.asp?ai=16&ip=79.180.37.230&course=c20478/2012b&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&ar=c20478_12b_784_01_1&ticket=58353E7A69BF1B9XO655E9E683016C5255C08DD37211ECF495F72A64E5278AA434CSP3C10C028D604AAD6C39FE7D71386D230983BBAF58A2511D14222F95090AE2C4C55CB696B82919A5A8EB44EAF8954DEDB5" 

for i in $(curl -s "$link" | awk '/mms/ {gsub (/<ref href="/, ""); gsub(/" \/>/, ""); print $0}') 
do 
    mplayer $i -dumpstream -dumpfile $i.wmv -vf scale=320:240 
done 
+1

besser zitieren '" $ link "' –