LINUX.ORG.RU

Для лучшего понимания процесса

Для «борьбы» с пробелами есть два способа: экранирование с помощью \ и использование кавычек.

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

Далее же идёт вызов basename $var, что оболочкой раскрывается в basename /1/2 3/4 5/file.txt (простой подстановкой вместо переменной её содержимого). Тут уже оболочка стандартно разбивает получившуюся командную строку на операнды, в результате чего basename передаются 3 аргумента, а не 1, как вы хотели.

Так как вмешаться в процесс и экранировать пробелы после раскрытия переменной нельзя, следует использовать кавычки: basename "$var" - что после раскрытия переменной превратится в basename "/1/2 3/4 5/file.txt" - здесь уже оболочка стандартно разобъёт строку на два операнда, и basename передастся 1 аргумент, как вам и нужно.

anonymous ()
Ответ на: комментарий от niXman

var=«/1/2\ 3/4\ 5/file.txt»

здесь не нужно экранирование (или не нужны кавычки).

var2=«$(basename \»$var\")"

здесь ненужны кавычки вокруг $(…), и если вы их уберёте, тогда можно будет записать

var2=$(basename  "$var")

PS: мой вариант:

var2=${var##*/}

emulek ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.