bash- definindo variáveis com VAR = $ {[number]: - default}

0

Eu encontrei um script que usa

VAR1=${1:-8}

VAR2=${2:-4}

Eu posso ver de algumas outras perguntas e jogando com algum código que

VAR1=${VAR2:-8}

criará VAR1 com um valor de qualquer VAR2 , se existir. Se VAR2 não for definido, VAR1 será o valor padrão 8 e VAR2 permanecerá não definido. Ou seja, após esse comando, echo VAR2 não retornará nada.

Então, minha pergunta é o que a primeira linha de código faz. Como os nomes das variáveis não podem começar com números, VAR1 claramente não está sendo definido como 1 ou qualquer variável chamada 1. Certamente há razão para isso, e não é apenas um pouco de ofuscação sem sentido?

    
por barriboy 17.01.2017 / 21:23

2 respostas

3

As variáveis usadas em ${1:-8} e ${2:-4} são os parâmetros posicionais $1 e $2 . Estes mantêm os valores passados para o script (ou função de shell) na linha de comando. Se eles não estiverem definidos, as substituições de variáveis mencionadas usarão os valores padrão 8 e 4 (respectivamente).

Um script ou função shell pode receber qualquer (?) número de argumentos, e estes podem ser obtidos usando $1 , $2 , ... no script / função. Para obter os valores dos parâmetros posicionais acima de 9, é necessário escrever ${10} , ${11} etc.

Isso poderia ser usado em um script de shell ou em uma função de shell que leva (pelo menos) dois argumentos de linha de comando, aos quais você gostaria de fornecer valores padrão se eles não fossem fornecidos.

Outra substituição de variável útil nesse caso é ${parameter:?word} , que exibirá word como um erro (e sairá do script) se parameter não estiver definido:

$ cat script.sh
#!/bin/bash
var1="${1:?Must provide command line argument}"
printf 'I got "%s"\n' "$var1"

$ ./script.sh
script.sh: line 3: 1: Must provide command line argument

$ ./script.sh "Hello world"
I got "Hello world"
    
por 17.01.2017 / 21:31
1

Refere-se aos parâmetros posicionais $1 ... $n .

${1:-default} significa "se o parâmetro 1 não estiver definido ou vazio, use default ".

Advertência: não confunda ${1:-2} com ${1: -2} . Com bash, o último é substituído pelos dois últimos caracteres de $1 .

Exemplo:

$ set --
$ echo "${1:-2}"
2

$ set 345 678
$ echo "${1:-2}"
345

$ echo "${1: -2}"
45
    
por 17.01.2017 / 21:31