Моя собственная переменная для длинных трактов

Я пишу некоторый резервный сценарий, и путь назначения довольно длинен. Я мог определить что-то вроде этого?

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
2
задан 1 November 2015 в 02:14

3 ответа

Переменное присвоение корректно, но у Вас есть ошибка синтаксиса в Вашей команде, которая использует переменную:

Что необходимо ввести, вместо этого:

cp file.txt "${TARGET}/some folder with spaces/file.txt"
cp file.txt "$TARGET/some folder with spaces/file.txt"

Обратите внимание на эти два изменений:

  • Двойные кавычки "..." вместо одинарных кавычек '...', потому что двойные кавычки позволяют расширение переменной удара, в то время как одинарные кавычки запрещают это и сохраняют строку как есть.

  • Поскольку переменная непосредственно встраивается в строку пути, и никакие пробелы не, прежде и после ее имени, нам нужно ${variable} вместо просто $variable здесь. Вихревые фигурные скобки говорят удар, где точно концы имени переменной, иначе это не было бы ясно.

    Фигурные скобки не являются неправильными, но также и не необходимыми здесь в этом случае как следующий символ после того, как имя переменной будет a /, который не позволяется на само имя и поэтому разделяет имя от остальной части строки.
    Благодаря ответу @heemayl для исправления этого!

2
ответ дан 2 December 2019 в 03:51

Короткий ответ: ДА! Вы получили его корректных 100%. Хотя, если Вы хотите сделать ту переменную доступной для других сценариев, не забывают работать export TARGET.

-1
ответ дан 2 December 2019 в 03:51

Существуют определенные правила определения имени переменной в 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
    
1
ответ дан 2 December 2019 в 03:51

Другие вопросы по тегам:

Похожие вопросы: