Слишком много ошибок аргументов в скрипте bash

Я изменил этот скрипт для загрузки песен с 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=

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

2 ответов


всякий раз, когда у вас есть сценарий оболочки, который вам нужно отладить, используйте set -xv. Это включится подробное режим, который распечатает каждую выполненную строку и включит 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

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

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

как и все команды, оболочка будет разбивать параметры, которые вы даете команде на пробелы. Таким образом, ваш титул"жизнь редьки" будет разбиты на пять отдельных параметров "The", "жизни", "of", "а" и "редиска" перед тем, как перейти к этому .

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

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

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

кстати, распечатайте manpage на тест ($ 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 и [ имеют тот же номер индекса, и, таким образом, действительно тот же файл, который связан (через ln command) в тот же файл.

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


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

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