Слишком много ошибок аргументов в скрипте 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" ...