2

Я ужасно разбираюсь в bash-скриптинге, и мне нужна помощь со следующим:

#!/bin/bash

if [ -e Pretty* ];then
ncftpput -R -DD -v -u xbmc -p xbmc 192.168.1.100 /home/xbmc/TV/Pretty_Little_Liars/ Pretty*
else
echo "No new folders"
fi

find -depth -type d -empty -exec rmdir {} \;

Проблема здесь в строке ncftpput ... если я просто делаю простое [echo "работает"], все в порядке, но когда я пытаюсь использовать строку ncftpput, она просто дает мне [строка 5: [: слишком много аргументов]

одна команда ncftpput работает нормально ..

Есть идеи?

3 ответа3

4

Вы не можете использовать globbing с -e внутри [] потому что он может вернуть более одного результата, что приведет к ошибке слишком много аргументов.

Ты можешь попробовать:

shopt -s nullglob
if [[ -n "$(echo Pretty*)" ]]

или же

if [[ "$(echo Pretty*)" != "Pretty*" ]]

Также используйте отступы, пробелы и продолжение строки, чтобы сделать ваш код более читабельным:

#!/bin/bash

shopt -s nullglob
if [[ -n "$(echo Pretty*)" ]]; then
    ncftpput -R -DD -v -u xbmc -p xbmc 192.168.1.100 \
        /home/xbmc/TV/Pretty_Little_Liars/ Pretty*
else
    echo "No new folders"
fi

find -depth -type d -empty -exec rmdir {} \;
0

Попытайся.

#!/bin/bash -x

if [ -e "Pretty*" ];then
`ncftpput -R -DD -v -u xbmc -p xbmc 192.168.1.100 /home/xbmc/TV/Pretty_Little_Liars/ Pretty*`
else
echo "No new folders"
fi

find -depth -type d -empty -exec rmdir {} \;
0

Ну, если он жалуется на слишком много аргументов, прервите его с помощью for.

#!/bin/bash

if [ -e Pretty* ];then
   for FILE in Pretty*
   do
       ncftpput -R -DD -v -u xbmc -p xbmc 192.168.1.100 /home/xbmc/TV/Pretty_Little_Liars/ "$FILE"
   done
else
   echo "No new folders"
fi

find -depth -type d -empty -exec rmdir {} \;

Использование "" вокруг $ FILE гарантирует, что файлы с пробелами в их именах не сделают ничего неожиданного.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .