2013-07-15 20 views
6

zmodyfikowałem skrypt do pobierania utworów z YouTube, ale otrzymuję następujący błąd podczas uruchamiania go tak:zbyt wiele argumentów błąd w skrypcie bash

sh youtube2mp3.sh https://www.youtube.com/watch?v=gpOJ6iu8fqQ 

błędów:

youtube2mp3.sh: line 31: [: too many arguments 
youtube2mp3.sh: line 39: [: too many arguments 
youtube2mp3.sh: line 49: [: too many arguments 
Sorry but the system encountered a problem. 

Numery linii odnoszą się do trzech linii if [ -f $video_title.$ext1 ] ... Myślałem, że mam argumenty w porządku, jak działało w poprzedniej wersji, ale utknąłem w tym momencie - czy ktoś mógłby wyjaśnić, co muszę zrobić, aby to poprawić ?

address=$1 

video_title="$(python youtube-dl $address)" 

ext1="flv" 
ext2="mp4" 
ext3="webm" 



if [ -f $video_title.$ext1 ] 
then 
    ffmpeg -i $video_title.$ext1 "$video_title".wav 
    lame "$video_title".wav "$video_title".mp3 
    rm $video_title.$ext1 "$video_title".wav 
else 
    if [ -f $video_title.$ext2 ] 
    then 
     ffmpeg -i $video_title.$ext2 "$video_title".wav 
     lame "$video_title".wav "$video_title".mp3 
     rm $video_title.$ext2 "$video_title".wav 
    else  
     if [ -f $video_title.$ext3 ] 
     then 
      ffmpeg -i $video_title.$ext3 -acodec libmp3lame -aq 4 "$video_title".mp3 
      rm $video_title.$ext3 
     else 
      echo "Sorry but the system encountered a problem." 
     fi 

    fi 
fi 
+6

Spróbuj podwójne cytowanie nazwy zmiennych w komendzie testowej. na przykład 'if [-f" $ video_title. $ ext1 "]' etc – user000001

+1

uruchamiasz go w 'sh' zamiast' bash'. spróbuj to zmienić i zgłoś to. również umieść "" "wokół adresu URL i zgłoś to. – mnagel

+0

Jest to w zasadzie duplikat https://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-shell-variable – tripleee

Odpowiedz

6

Gdy masz skrypt potrzebne do debugowania, użyj set -xv. Spowoduje to włączenie trybu verbose, który wydrukuje każdy wykonany wiersz, i włączy on xtrace, który wyświetli komendę po zakończeniu rozwijania.

Możesz wyłączyć set -xv za pomocą set +xv. Możesz objąć cały skrypt lub tylko linie powodujące twoje bóle serca.

Jeśli to zrobiłeś, prawdopodobnie zobaczysz, że $video_title zostanie rozwinięty do nazw zawierających spacje, i wtedy otrzymasz swoje błędy. powinno być oddanie cytaty wszędzie w skrypcie, gdzie trzeba `$ VIDEO_TITLE":

if [ -f "$video_title".$ext2 ] #QUOTES! 
then 
    ffmpeg -i "$video_title".$ext2 "$video_title".wav #EVEN MORE QUOTES 

Pamiętaj, że [ jest właściwie komenda i jest synonimem dowodzić test Twój rozkaz if można zapisać jako:.

if test -f "$video_title".$ext2 #QUOTES! 
then 

Podobnie jak wszystkie polecenia, powłoka będzie zerwać parametry oddawać do komendy na białym przestrzeni. tak więc tytuł „życiu Rzodkiew” dostanie podzielone jak pięć oddzielnych parametrów „The”, "Life", "z", "a" i "Rzodkiew" zanim przeszedł do tego polecenia test.

To wyjaśnia swój komunikat o błędzie:

youtube2mp3.sh: line 31: [: too many arguments 

Ponieważ parametr linii poleceń -f może trwać jeden dodatkowy parametr, a nie tylko pięć parametrów powłoki przekazywane do niej. Cytaty sprawiają, że powłoka nie dzieli tytułu wideo na osobne parametry na flagę -f.

Nawiasem mówiąc, wydrukować manpage na testu ($ man test), a zobaczysz, że ma wszystkie te same parametry Twój [ ... ] podjąć.Wyjaśnia to również, dlaczego [ i ] muszą być otoczone spacjami - są to polecenia uniksowe, a polecenia uniksowe muszą być otoczone białymi przestrzeniami.

również uruchomić polecenie:

$ ls -il /bin/[ /bin/test 
10958 -rwxr-xr-x 2 root wheel 18576 May 28 22:27 /bin/[ 
10958 -rwxr-xr-x 2 root wheel 18576 May 28 22:27 /bin/test 

To pierwszy parametr jest iwęzeł. Jest to coś w rodzaju prawdziwej nazwy pliku (Co sądzisz, że nazwa pliku i katalog są atrybutami i-węzła). Zobaczysz, że zarówno test, jak i [ mają ten sam numer i-węzła, a więc są tym samym plikiem, który jest połączony (za pomocą polecenia ln) z tym samym plikiem.

(nie do końca prawda. Na [ jest wbudowane polecenia zarówno Korn i BASH które prawdopodobnie były używane. Jednak polecenie wbudowane [ jest wewnętrznie połączony z innym poleceniem wbudowanym nazywa test anyway.)

8

Zawsze podawaj rozszerzenie parametrów. Wartość $video_title jest dzielona na wiele wyrazów, co dezorientuje polecenie [.

if [ -f "$video_title.$ext1" ] 
then 
    ffmpeg -i "$video_title.$ext1" ... 
Powiązane problemy