2009-01-17 14 views
8

Aquí es mi guión:shell script de Expansión de tilde

#!/bin/bash 
echo "Digite o local em que deseja instalar o IGRAFU(pressione enter para 
instalar em 
${HOME}/IGRAFO):" 
read caminho 
if test -z $caminho 
then 
caminho="${HOME}/IGRAFO" 
fi 
echo "O IGRAFU será instalado no diretório: $caminho" 
mkdir -pv $caminho 

mv -v ./* $caminho 
echo "Pronto!" 

A 'leer Caminho' I podrán recibir del usuario una ruta como ~/SomeFolder. Cuando el script recibe ese tipo de ruta, tanto mv como mkdir no harán la expansión de tilde, por lo que intentará crear una ~/somefolder y no/home/username/somefolder y, por lo tanto, fallará.

¿Cómo me aseguro de que la tilde se convierta en la variable HOME?

Respuesta

14

Probablemente necesite evaluar la variable para que se la sustituya correctamente. Un ejemplo sería simplemente hacer

caminho=`eval "echo $caminho"` 

Tenga en cuenta que esto se romperá si caminho contiene punto y coma o comillas, también tratará barras invertidas como escapar, y si los datos no es de confianza, es necesario tener cuidado de que usted No es el objetivo de un ataque de inyección.

Espero que ayude.

-1

Quizás use /home/${USER} sustituyendo su directorio de alto nivel de usuario si no es /home.

+3

Suponiendo que todos los directorios de los usuarios domésticos tienen un directorio padre común es una muy mala suposición. –

2

Citar y expandir siempre son complicados, especialmente en bash. Si su propio directorio es lo suficientemente bueno, este código funciona (he probado):

if test -z $caminho 
then 
caminho="${HOME}/IGRAFO" 
else 
    case "$caminho" in 
    '~') caminho="$HOME" ;; 
    '~'/*) caminho="$HOME/${caminho#'~/'}" ;; 
    '~'*) echo "Case of '$caminho' is not implemented" 1>&2 ;; 
    esac 
fi