como declarar variáveis de linha de comando em shell scripts?

0

Eu quero declarar a variável como um argumento de linha de comando para um shell script como

./ script.sh

file=/tmp/domains.txt 
domain=abcd.com**

ajude a fazer o mesmo.

    
por Sunil 21.09.2015 / 13:44

2 respostas

5

Você pode passar essas variáveis especificando-as antes do nome do comando; por exemplo,

file=/tmp/domains.txt domain=abcd.com ./script.sh

Fazendo assim, essas variáveis são colocadas no ambiente antes da execução do script de shell, o que significa que você pode usá-las no shell script como qualquer outra variável.

    
por 21.09.2015 / 13:50
1

A passagem de variáveis como essa funciona, mas exige que o usuário entenda os aspectos internos do seu script. Ele também pode causar um comportamento estranho e aparentemente inexplicável se as variáveis forem definidas no ambiente por algum outro motivo totalmente não relacionado ao seu script (e o usuário esquecer de configurá-las na linha de comando ao executar seu script).

A melhor maneira de fazer isso é usar a análise de opção interna do shell, getopts . Por exemplo:

usage() {
    # print some help text here, e.g.
    echo Usage:
    echo "      $0 [-f filename] [-d domainname]"
}

# -f and -d are the only valid options and they both
# take strings as arguments.
while getopts f:d: opt; do
  case "$opt" in
     f) file="$OPTARG" ;;
     d) domain="$OPTARG" ;;
     *) usage ; exit 1 ;;
  esac
done
shift $(expr $OPTIND - 1)

# print help message and exit if either file or domain are
# empty.
[ -z "$file" ] && usage && exit 1
[ -z "$domain" ] && usage && exit 1

Veja a página do manual do seu shell (por exemplo, man bash ou man dash ) para obter mais detalhes. O comando help de bash também fornece informações úteis sobre getopts - por exemplo, help getopts

Se você quiser usar as opções longas do estilo GNU (por exemplo, --file , --domain ), bem como as curtas -f e -d , você pode usar o programa getopt do util-linux package. Observe que isso é getopt sem um "s", enquanto o interno é getopts com um "s".

Eu costumo usar o util-linux getopt porque eu gosto de poder ter --longas opções ... mas getopts é padrão e não requer nada extra para ser instalado porque ele é construído para cada shell compatível com posix, e funcionará com bash, dash, ksh etc.

    
por 22.09.2015 / 02:44