базовое имя с пробелами в скрипте bash? - PullRequest
19 голосов
/ 25 августа 2011

Я работаю над сценарием bash, чтобы создать новую папку в / tmp /, используя имя файла, а затем скопировать файл в эту папку.

#!/bin/bash

MYBASENAME="`basename $1`"
mkdir "/tmp/$MYBASENAME"

for ARG in "$@"
    do
        mv "$ARG" "/tmp/$MYBASENAME"

done

Поведение:

Когда я набираю mymove "/home/me/downloads/my new file.zip", это показывает:

mkdir /tmp/my
new
file.zip
mv: rename /home/me/downloads/my new file.zip to /tmp/my\nnew\nfile.zip:

У меня много цитат вокруг всего, поэтому я не понимаю, почему это работает не так, как ожидалось.

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

Ответы [ 4 ]

17 голосов
/ 25 августа 2011

В случае, когда присваивание является подстановкой одной команды, вам не нужно заключать подстановку команд в кавычки. Оболочка не выполняет разбиение слов для присвоений переменных.

MYBASENAME=$(basename "$1")

это все, что нужно. Вы должны привыкнуть использовать $() вместо обратных кавычек, потому что $() вкладывается легче (это POSIX, кстати, и все современные оболочки поддерживают его).

PS: Вы должны попытаться не написать bash сценарии. Попробуйте написать shell сценарии. Разница заключается в отсутствии bashisms, zshisms и т. Д. Как и в случае с C, переносимость является желательной особенностью сценариев, особенно если она может быть легко достигнута. Ваш сценарий не использует никаких bashisms, поэтому я бы вместо этого написал #!/bin/sh. Для селекционеров: Да, я знаю, старые SunOS и Solaris /bin/sh не понимают $(), но /usr/xpg4/bin/sh - это оболочка POSIX.

4 голосов
/ 25 августа 2011

Проблема в том, что $1 в

MYBASENAME="`basename $1`" 

не котируется. Используйте это вместо:

MYBASENAME="$(basename "$1")"
2 голосов
/ 25 августа 2011

Вам не хватает одного набора цитат!

MYBASENAME="`basename \"$1\"`"

Это решит твою проблему.

0 голосов
/ 25 августа 2011
MYBASENAME="`basename $1`"

должно быть

MYBASENAME="`basename "$1"`"

Обернуть $1 двойными кавычками "$1"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...