Shell脚本波浪号扩展

8

这是我的脚本:

#!/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个回答

14
你可能需要使用eval函数才能正确地替换变量。一个例子是简单地执行:
caminho=`eval "echo $caminho"`

请注意,如果caminho包含分号或引号,此方法将无法正常工作,它还将把反斜线视为转义符。如果数据不受信任,则需要注意您不会成为注入攻击的目标。

希望这能有所帮助。


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

-1
也许可以使用/home/${USER}代替您的高级用户目录(如果不是/home)。

3
假设所有用户的主目录都有一个共同的父目录是一个非常糟糕的假设。 - Dave C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接