Shell Script Tilde扩展

时间:2009-01-17 17:15:16

标签: linux shell

这是我的剧本:

#!/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!"

在'read caminho'中,我可能会从用户那里收到像〜/ somefolder这样的路径。当脚本收到那种路径时,mv和mkdir都不会进行代码扩展,所以它会尝试创建一个〜/ somefolder而不是/ home / username / somefolder,因此会失败。

如何确保将波浪号转换为HOME变量?

3 个答案:

答案 0 :(得分:14)

您可能需要评估变量才能正确替换它。一个例子是简单地做

caminho=`eval "echo $caminho"`

请记住,如果caminho包含分号或引号,它会中断,它也会将反斜杠视为转义,如果数据不受信任,则需要注意不要将其作为目标。注射攻击。

希望有所帮助。

答案 1 :(得分:2)

引用和扩展总是很棘手,尤其是在bash中。 如果你自己的主目录足够好,这段代码可以工作(我已经测试过了):

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

答案 2 :(得分:-1)

如果不是/home/${USER},可以使用/home代替您的高级用户级目录。