2009-01-17 58 views
8

这里是我的脚本: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!" 

在“读caminho”我可以接收来自用户的喜欢〜/ somefolder的路径。当脚本收到这样的路径时,mv和mkdir都不会进行代字符扩展,所以它会尝试创建〜/ somefolder而不是/ home/username/somefolder,因此会失败。

如何确保代字号将转换为HOME变量?

回答

14

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

caminho=`eval "echo $caminho"` 

请记住,这将打破,如果caminho包含分号或引号,它也会把反斜杠作为逃避,如果数据是不可信的,你需要照顾你不是注射攻击的目标。

希望有所帮助。

-1

如果不是/home,也许使用/home/${USER}替代高级用户级别的目录。

+3

假设所有用户的主目录有一个共同的父目录是一个非常坏的假设。 – 2009-01-17 17:46:52

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