Como passar o diretório com espaço escapado para variável?

1

Eu tenho um pequeno script test.sh da seguinte forma:

#!/bin/bash
read -e -p "Enter a Directory: " directory
echo $directory

Veja o que acontece quando eu o executo:

$ ./test.sh 
Enter a Directory: ~/A\ Directory/
/Users/<username>/A Directory/

Eu quero ser capaz de manter o espaço de escape dentro dessa variável para que a saída do programa seja lida:

$ ./test.sh 
Enter a Directory: ~/A\ Directory/
/Users/<username>/A\ Directory/

Alguém sabe como fazer isso? O uso disso é dizer ao script onde procurar por arquivos que ele precisa ler.

Edit: Esqueci de colocar o \ na segunda e terceira seleção de código.

    
por Matthew Sanabria 03.10.2015 / 18:33

3 respostas

0

Você poderia tentar assim:

Exemplo 1: sua resposta.

#!/bin/bash
read -e -p "Enter a Directory: " directory
new_directory="$(echo $directory | sed 's/ /\ /g')"
echo $new_directory

Exemplo 2: Se você estiver indo para a saída do script cd , coloque-a entre aspas duplas.

#!/bin/bash
read -e -p "Enter a Directory: " directory
new_directory=\"$directory\"
echo $new_directory
    
por 03.10.2015 / 18:46
3

Não há espaço com escape na variável para manter. Quando você digita ~/A Directory/ no prompt, a variável directory contém ~/A Directory/ . Se você está tendo problemas com este espaço mais tarde no seu script, é porque você esqueceu as aspas duplas em torno das expansões de variáveis .

read -e -p "Enter a Directory: " directory
ls -- "$directory"
cd -- "$directory"

O -- é para o caso de o valor começar com - , de modo que não seja tratado como uma opção.

Se por algum motivo você quiser adicionar uma barra invertida antes dos espaços, você pode fazer isso com recursos de manipulação de string do bash .

echo "${directory// /\ }"

É altamente improvável que isso seja útil. Se você precisar imprimir o diretório em um formulário que será analisado novamente, definitivamente haverá outros caracteres para citar. Quais caracteres dependem do que vai analisá-lo, mas pelo menos as guias (e as novas linhas, mas o script não consegue lê-las) precisarão de cotação se os espaços o fizerem, e uma barra invertida também precisará ser citada. Bash não tem uma maneira conveniente de fazer isso. Você pode usar sed, mas tenha cuidado ao passar os dados para ele - echo não imprime todos os argumentos não modificados. Uma substituição de comando de dificuldade adicionada retira novas linhas, mas você não terá novas linhas aqui.

quoted_directory=$(printf %s "$directory" | sed 's/[\ '$'\t'']/\&/')

Note também que nada aqui expande o til no começo. (A saída que você mostra é falsa, impertinente você!) A expansão de til acontece apenas como parte da análise do código-fonte, mas não acontece quando o valor de uma variável é expandido. Se você quiser substituir um til inicial com o diretório inicial, precisará fazer isso manualmente.

read -e -p "Enter a Directory: " directory
if [[ $directory = \~/* ]]; then
  directory="$HOME/${directory#*/}"
fi
ls -- "$directory"
cd -- "$directory"
    
por 04.10.2015 / 01:51
0

Por link ,

Limpe a variável do IFS assim:

   IFS=$'\n'       # make newlines the only separator

Em seguida, continue seu roteiro.

    
por 03.10.2015 / 18:49