2013-07-15 14 views
6

YouTube'dan şarkı indirmek için bu komut dosyası değiştirdiniz ama bu gibi çalıştırdığınızda aşağıdaki hatayı alıyorum:Çok fazla argüman hatası

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

Hataları:

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. 

Satır numaraları, üç if [ -f $video_title.$ext1 ] satırına atıfta bulunuyor ... Daha önceki bir sürümde çalıştığı gibi argümanlarımın iyi olduğunu düşündüm ama bu noktada sıkışıp kaldım - birisi bunu düzeltmek için ne yapmam gerektiğini açıklayabilir ?

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

çift alıntı deneyin Test komutundaki değişken isimleri. Örneğin. Eğer [-f "$ video_title. $ ext1"] 'etc – user000001

+1

ise" bash "yerine" sh "ile çalıştırırsınız. Bunu değiştirmeye ve geri rapor etmeye çalışın. aynı zamanda url'nizin etrafına '' '' koyar ve bununla ilgili rapor verir. – mnagel

+0

Bu, temel olarak https://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-shell-variable dosyasının bir kopyasıdır. – tripleee

cevap

6

, set -xv kullanın. Bu, yürütülen her satırı basacak olan ayrıntılı modunu açacak ve genişletme işlemi tamamlandığında komut görüntülenecek olan xtrace'u açacaktır.

set -xv'u set +xv ile kapatabilirsiniz. Senaryonun tamamını veya sadece kalp atışlarına neden olan çizgileri zarflayabilirsin.

Bunu yaptıysanız, $video_title'un boşluk içeren isimlere genişletildiğini göreceksiniz ve hatalarınızı aldığınız zaman bunu göreceksiniz.

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

[ aslında bir emirdir ve test komuta bir eşanlamlı olduğunu unutmayın Sizin if komut olarak yazılmış olabilir: Eğer komut her yerde tırnak koyarak gerektiğini size `$ video_title" bölümüne sahiptir.

bütün komutlar gibi
if test -f "$video_title".$ext2 #QUOTES! 
then 

, boşlukların üzerine komuta vermek parametreleri kıracak kabuğu. Böylece, sizin başlığı "bir Turp ait Yaşam" beş ayrı parametre olarak kırılmış alacak "", "Hayat",, "a" ve "Turp" "nin" önce bu test komutuna geçirilen. -f komut satırı parametre yalnızca bir ek parametre alabilir ve beş parametre kabuk kendisine geçirilen Çünkü

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

:

Bu hata mesajı açıklıyor. Tırnaklar, kabuğun video başlığınızı -f bayrağına ayrı parametrelere ayırmasını engelliyor. Bu arada

, testinde ($ man test) üzerine manpage çıktısını ve bunu sizin [ ... ] almak aynı parametrelerin hepsi aldığını göreceksiniz.Ayrıca, neden [ ve ]'un boşluklarla çevrili olması gerektiğini de açıklıyor - bunlar Unix komutları ve Unix komutları beyaz boşluklarla çevrili olmalıdır.

Ayrıca, bu komutu çalıştırın: İlk parametre inode olduğunu

$ 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 

O. Dosyanın gerçek adı gibi bir şey (Dosya adı ve dizinin inode'un nitelikleri olduğunu düşünüyorsunuz). Hem test hem de ['un aynı inode numarasına sahip olduğunu göreceksiniz ve bu nedenle aynı dosyaya (ln komutuyla) bağlanan aynı dosyadır.

(tamamen doğru değil. [ muhtemelen kullandığınız Korn ve BASH hem bir yerleşik komuttur. Bununla birlikte, [ yerleşik komutu dahili olarak başka yerleşik komutu ile bağlantılıdır zaten test denir.)

8

Her zaman parametre genişlemesini alıntılayın. $video_title'un değeri, [ komutunu karıştıran birden çok kelimeye bölünüyor. Hata ayıklamak için gereken bir kabuk yaşadığımızda

if [ -f "$video_title.$ext1" ] 
then 
    ffmpeg -i "$video_title.$ext1" ... 
İlgili konular