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"