2013-07-15 2 views
6

Я модифицировал этот сценарий, чтобы скачать песни с YouTube, но я получаю следующее сообщение об ошибке, когда я запускаю его, как это:Слишком много аргументов ошибки в Баш скрипт

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

Ошибки:

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. 

Номера строк относятся к трем линиям if [ -f $video_title.$ext1 ] ... Я думал, что у меня есть аргументы в порядке, поскольку это сработало в предыдущей версии, но я застрял на этом этапе - может кто-нибудь объяснить, что мне нужно сделать, чтобы исправить это ?

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

Попробуйте дважды процитировать имена переменных в тестовой команде. например 'if [-f" $ video_title. $ ext1 "]' и т. д. – user000001

+1

вы запускаете его в 'sh' вместо' bash'. попытайтесь изменить это и отчитаться. также помещайте '' '' вокруг своего URL-адреса и сообщайте об этом. – mnagel

+0

Это в основном дубликат https://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-shell-variable – tripleee

ответ

6

Всякий раз, когда у вас есть скрипт, вам нужно отлаживать, использовать set -xv. Это включит verbose режим, который распечатает каждую выполненную линию и включит xtrace, который отобразит команду при выполнении расширения.

Вы можете отключить set -xv с set +xv. Вы можете огибать весь ваш сценарий или просто линии, вызывающие ваши страдания.

Если вы это сделали, я думаю, вы увидите, что $video_title расширился до имен с пробелами в них, и именно тогда вы получите свои ошибки. Вы должны помещать кавычки везде в сценарии, где у вас есть `$ VIDEO_TITLE":

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

Помните, что [ на самом деле команда и является синонимом команды test Ваша команда if может быть записана в виде:.

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

Как и все команды, оболочка будет разбивать параметры, которые дают команду на белых пространствах. Таким образом, ваше название «жизни редьки» получит распалось как пяти отдельных параметров «The», "Жизнь", "из", "а" и "Редька" перед передачей этой test команды.

Это объясняет ваше сообщение об ошибке:

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

Поскольку параметр -f командной строки может принимать только один дополнительный параметр, а не пяти параметров оболочки, переданный ему. Кавычки не позволяют оболочке разбивать ваш заголовок видео на отдельные параметры на флаг -f.

Кстати, распечатать справочную страницу по теста ($ man test), и вы увидите, что он принимает все те же параметры вашей [ ... ] принять.Это также объясняет, почему [ и ] должны быть окружены пробелами - это команды Unix, а команды Unix должны быть окружены пробелами.

Также используйте эту команду:

$ 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 

Это первый параметр является инф.узлов. Это похоже на реальное имя файла (что, по вашему мнению, является именем файла, а каталог является атрибутом inode). Вы увидите, что оба test и [ имеют одинаковый номер inode и, таким образом, представляют собой тот же файл, который связан (через команду ln) с тем же файлом.

(не совсем верно. [ является встроенной командой, чтобы как Korn и BASH, которые вы, вероятно, использовать. Однако, встроенная команда [ внутренне связана с другой встроенной команды называется test в любом случае.)

8

Всегда указывайте расширение параметра. Значение $video_title разделяется на несколько слов, что смущает команду [.

if [ -f "$video_title.$ext1" ] 
then 
    ffmpeg -i "$video_title.$ext1" ... 
Смежные вопросы