2009-01-17 9 views
8

Voici mon script:Script Shell Tilde Expansion

#!/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 'lire caminho' je peux recevoir de l'utilisateur un chemin comme ~/somefolder. Lorsque le script reçoit ce type de chemin, mv et mkdir ne font pas d'extension tilde, donc il va essayer de créer un ~/somefolder et non/home/username/somefolder et donc échouer.

Comment puis-je m'assurer que le tilde sera converti en la variable HOME?

Répondre

14

Vous aurez probablement besoin d'évaluer la variable pour la remplacer correctement. Un exemple serait simplement faire

caminho=`eval "echo $caminho"` 

Gardez à l'esprit que cela va se briser si caminho contient des points-virgules ou des guillemets, il traitera également antislashs comme échapper, et si les données sont non fiables, vous devez prendre soin que vous ne sont pas la cible d'une attaque par injection.

Espérons que ça aide.

-1

Peut-être utiliser /home/${USER} au lieu de substituer votre répertoire de niveau d'utilisateur élevé si ce n'est pas /home.

+3

En supposant que tous les utilisateurs des répertoires de base ont un répertoire parent commun est une hypothèse très mauvaise. –

2

La citation et l'expansion sont toujours difficiles, surtout dans bash. Si votre répertoire est assez bon, ce code fonctionne (je l'ai testé):

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