Shell Script Tilde Расширение - PullRequest
       4

Shell Script Tilde Расширение

8 голосов
/ 17 января 2009

Вот мой сценарий:

#!/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 голосов
/ 17 января 2009

Вам, вероятно, потребуется оценить переменную, чтобы она была правильно подставлена. Одним из примеров будет просто сделать

caminho=`eval "echo $caminho"`

Имейте в виду, что это сломается, если caminho содержит точки с запятой или кавычки, обратные слеши также будут рассматриваться как экранирующие, и если данные не заслуживают доверия, вам следует позаботиться о том, чтобы вы не были целью инъекционной атаки .

Надеюсь, это поможет.

2 голосов
/ 17 января 2009

Цитирование и расширение всегда сложно, особенно в 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
0 голосов
/ 17 января 2009

Может быть, вместо использования /home.

вместо вашего каталога пользователя верхнего уровня используется /home/${USER}.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...