Minha própria variável para caminhos longos

2

Estou escrevendo um script de backup e o caminho de destino é bem longo. Eu poderia definir algo assim?

TARGET='/media/user/externaldrive/folder with spaces/blahblah'

E depois usá-lo como parte de um caminho?

cp file.txt '$TARGET/some folder with spaces/file.txt'

A variável pode ser definida apenas para este script.

Qual é o caminho certo para fazer isso? Porque é isso que eu recebo:

cp: cannot create regular file ‘$TARGET/some folder with spaces/file.txt’: No such file or directory
    
por Sebastian 31.10.2015 / 21:43

3 respostas

3

A atribuição da variável está correta, mas você tem um erro de sintaxe no seu comando que usa a variável:

O que você precisa digitar é:

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

Observe as alterações duas :

  • Aspas duplas "..." em vez de aspas simples '...' , porque as aspas duplas permitem a expansão da variável bash, enquanto as aspas simples proíbem isso e mantêm a sequência como ela é.

  • Como a variável está diretamente incorporada na seqüência de caminho e nenhum espaço é antes e depois do nome, precisamos de ${variable} em vez de apenas $variable aqui. As chaves enroladas informam ao bash exatamente onde o nome da variável termina, caso contrário, isso não ficaria claro.

    As chaves não estão erradas, mas também não são necessárias aqui, pois o próximo caractere após o nome da variável é um / , que não é permitido no próprio nome e, portanto, separa o nome do resto the string.
    Graças à resposta do @heemayl para corrigir isso!

por Byte Commander 01.11.2015 / 00:08
1

Existem algumas regras para definir o nome de uma variável em bash :

  • O nome do Vaiables só pode conter caracteres de [[:alnum:]_] , ou seja, A-Z , a-z , 0-9 e _ .

  • O nome da variável não pode começar com um dígito

Portanto, ao obter o valor da variável, a menos que você tenha algum desses caracteres seguindo a variável, não precisará de {} para agrupar o nome da variável:

$ 1foo=bar
1foo=bar: command not found

$ foo1=bar

$ echo "$foo1"
bar

$ echo "$foo12"

$ echo "${foo1}2"
bar2

$ echo "$foo1_"

$ echo "${foo1}_"
bar_

No seu caso:

  • Remova as aspas simples e coloque aspas duplas ao usar cp , tudo dentro de uma aspa simples é considerado literalmente para que a variável não seja expandida

  • As aspas duplas são necessárias porque você tem espaços no caminho do arquivo, portanto, se você não usar aspas, sofrerá com a divisão de palavras ao usar cp

  • Ao obter o valor, $TARGET é seguido por / , que não é um caractere constituinte do nome da variável válido, portanto, {} não é necessário

    $ 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
    
por heemayl 01.11.2015 / 02:18
-2

Resposta curta: SIM! Você tem 100% correto. Embora, se você quiser disponibilizar essa variável para outros scripts, não se esqueça de executar export TARGET .

    
por Daniel 31.10.2015 / 22:52