Я пишу некоторый резервный сценарий, и путь назначения довольно длинен. Я мог определить что-то вроде этого?
TARGET='/media/user/externaldrive/folder with spaces/blahblah'
И затем используйте его как это как часть пути?
cp file.txt '$TARGET/some folder with spaces/file.txt'
Переменная может быть определена для этого сценария только.
Что правильный путь состоит в том, чтобы сделать это? Поскольку это - то, что я получаю:
cp: cannot create regular file ‘$TARGET/some folder with spaces/file.txt’: No such file or directory
Переменное присвоение корректно, но у Вас есть ошибка синтаксиса в Вашей команде, которая использует переменную:
Что необходимо ввести, вместо этого:
cp file.txt "${TARGET}/some folder with spaces/file.txt"
cp file.txt "$TARGET/some folder with spaces/file.txt"
Обратите внимание на эти два изменений:
Двойные кавычки "..."
вместо одинарных кавычек '...'
, потому что двойные кавычки позволяют расширение переменной удара, в то время как одинарные кавычки запрещают это и сохраняют строку как есть.
Поскольку переменная непосредственно встраивается в строку пути, и никакие пробелы не, прежде и после ее имени, нам нужно ${variable}
вместо просто $variable
здесь. Вихревые фигурные скобки говорят удар, где точно концы имени переменной, иначе это не было бы ясно.
Фигурные скобки не являются неправильными, но также и не необходимыми здесь в этом случае как следующий символ после того, как имя переменной будет a /
, который не позволяется на само имя и поэтому разделяет имя от остальной части строки.
Благодаря ответу @heemayl для исправления этого!
Короткий ответ: ДА! Вы получили его корректных 100%. Хотя, если Вы хотите сделать ту переменную доступной для других сценариев, не забывают работать export TARGET
.
Существуют определенные правила определения имени переменной в bash
:
Имя Vaiables может только содержать символы от [[:alnum:]_]
т.е. A-Z
, a-z
, 0-9
и _
.
Имя переменной не может запуститься с цифры
Таким образом, при получении значения переменной, если у Вас нет ни одного из этих символов после переменной, Вам не нужно {}
переносить имя переменной:
$ 1foo=bar
1foo=bar: command not found
$ foo1=bar
$ echo "$foo1"
bar
$ echo "$foo12"
$ echo "${foo1}2"
bar2
$ echo "$foo1_"
$ echo "${foo1}_"
bar_
В Вашем случае:
Удалите одинарные кавычки и поместите двойные кавычки при использовании cp
, все в одинарной кавычке взято буквально, таким образом, переменная не будет расширена
Двойная кавычка необходима, потому что у Вас есть пробелы в пути к файлу, поэтому если Вы не будете использовать кавычки, то это пострадает от разделения слова при использовании cp
При получении значения, $TARGET
сопровождается /
который не является символом составляющей допустимого имени переменной так {}
не необходимо
$ TARGET='/media/user/externaldrive/folder with spaces/blahblah'
$ echo '$TARGET'
$TARGET
$ echo '$TARGET/some folder with spaces/file.txt'
$TARGET/some folder with spaces/file.txt
$ echo "$TARGET/some folder with spaces/file.txt"
/media/user/externaldrive/folder with spaces/blahblah/some folder with spaces/file.txt