Bash скрипт не может быть запущен (слишком много аргументов) - PullRequest
0 голосов
/ 07 мая 2020
#!/bin/bash    
if [ -e *.txt ]                                                                                                         then
            rm *.txt
            echo "removing previous files"
    else
            echo "files already deleted"
    fi

Я пытаюсь удалить все текстовые файлы в моем текущем каталоге, если у меня более одного текстового файла, я получаю сообщение об ошибке. Не совсем уверен, что происходит.

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Если у вас есть, скажем, два файла 1.txt и 2.txt, ваш код в основном приводит к:

if [ -e 1.txt 2.txt ]
…

, что вызывает синтаксическую ошибку, потому что -e ожидает единственный аргумент.

Вы можете положиться на какой-нибудь инструмент CLI, такой как find, но, может быть, вам вообще не нужен if?

А именно:

rm -f *.txt

, чтобы избежать сбоя в случае отсутствия файла *.txt,

в противном случае:

rm -f -v *.txt

, если вы также хотите получить журнал удаленных файлов.

1 голос
/ 08 мая 2020

Сохраняя if ... fi logi c, здесь нет необходимости в тесте -e. Утилиты Unix сами по себе предназначены для возврата кодов выхода, и в этом случае проще проверить результат самого rm:

if rm *.txt 2> /dev/null
then
    echo "removing previous files"
else
    echo "files already deleted"
fi

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

if [ "$(ls *.txt)" ]

... или в чистом виде bash (не требуется внешнего использования, такого как ls), если мы временно установим nullglob вариант:

if (shopt -s nullglob; [ "$(echo *.txt)" ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...