Espaços para variáveis no script bash

5

Eu tenho um espaço em um dos nomes de diretório. Eu quero listar um arquivo sob ele de um script bash. Aqui está o meu script:

fpath="${HOME}/\"New Folder\"/foobar.txt"

echo "fpath=(${fpath})"
#fpath="${HOME}/${fname}"

ls "${fpath}"

A saída deste script é:

fpath=(/Users/<username>/"New Folder"/foobar.txt)
ls: /Users/<username>/"New Folder"/foobar.txt: No such file or directory

Mas quando está listando o arquivo no meu shell, ele existe:

$ ls /Users/<username>/"New Folder"/foobar.txt
/Users/<username>/New Folder/foobar.txt

Existe uma maneira de obter ls para exibir o caminho do meu script?

    
por kmad1729 08.03.2017 / 20:20

3 respostas

7

Basta remover as aspas duplas citadas:

fpath="${HOME}/New Folder/foobar.txt"

Como o conteúdo completo da variável está contido nas aspas duplas, não é necessário fazer isso uma segunda vez. O motivo pelo qual ele funciona na CLI é que o Bash avalia as citações primeiro. Ele falha na variável porque as aspas com escape de barra invertida são tratadas como uma parte literal do caminho do diretório.

    
por 08.03.2017 / 20:27
5

Is there a way I can get ls to display the path from my script?

Sim, use:

ls $HOME/New\ Folder/foobar.txt

O problema é que você estava incluindo as aspas dentro do valor da variável. O nome real do diretório não possui " quotes.

Você precisa criar a variável com apenas um um método de cotação.

Nas variáveis:

fpath=${HOME}/New\ Folder/foobar.txt

Ou:

fpath="${HOME}/New Folder/foobar.txt"

Ou até mesmo:

fpath=${HOME}/'New Folder/foobar.txt'

Script completo:

#!/bin/bash
fpath=${HOME}/New\ Folder/foobar.txt
echo "fpath=(${fpath})"
ls "${fpath}"
    
por 08.03.2017 / 20:31
3

As aspas não fazem parte do nome da pasta, são elas?

Isso deve funcionar:

fpath="$HOME/New Folder/foobar.txt"
ls "$fpath"
    
por 08.03.2017 / 20:28