variável de mudança de código shell na chamada de código

0

eu escrevi um pequeno código de shell, mas eu preciso mudar a variável ao chamar o código como fazer

Exemplo

./shell.sh --varaible="New Value"

deve sair

New Value,Some Value

shell.sh

variable="Old Value"
variable2="Some Value"

echo "$variable,$variable2"
    
por evenom 17.02.2018 / 10:04

1 resposta

3

Não é possível alterar o valor de uma variável em um script a partir da linha de comando se o script estiver definindo explicitamente o valor dessa variável.

Você pode, no entanto, definir o valor da variável de tal forma que leve em consideração os argumentos da linha de comando.

Os argumentos dados na linha de comando estarão disponíveis para o shell script nos parâmetros posicionais $1 , $2 , $3 etc.

Para definir uma variável para o primeiro parâmetro posicional, você usaria

variable="$1"

Assim, seu script pode parecer

#!/bin/sh

variable="$1"
variable2="Some Value"

echo "$variable,$variable2" # or printf '%s,%s\n' "$variable" "$variable2"

... e seria chamado com

$ ./script.sh "New Value"

A saída seria

New Value,Some Value

Para fornecer um valor padrão para uma variável, você pode fazer

variable="${1:-Old Value}"

Usando isso no script acima, a saída dirá Old Value,Some Value se o script não for chamado com nenhum argumento de linha de comando.

O script curto a seguir faz a análise correta da linha de comando de três sinalizadores de linha de comando, -a , -b e -c . Os sinalizadores -a e -b recebem um argumento, enquanto -c não. Ele usa três variáveis, var_a , var_b e var_c , que possuem valores padrão que podem ser substituídos usando os sinalizadores de linha de comando.

No final, o script exibe os valores dessas variáveis e também exibe o que mais pode ter sido dado na linha de comando.

#!/bin/sh

var_a=12
var_b="yellow"
var_c=0

while getopts 'a:b:c' opt; do
    case "$opt" in
        a) var_a=$OPTARG ;;
        b) var_b=$OPTARG ;;
        c) var_c=1 ;;
        *) echo 'command line parsing error' >&2
           exit 1
    esac
done

shift $(( OPTIND - 1 ))

printf 'var_a = %s\nvar_b = %s\nvar_c = %s\n' \
    "$var_a" "$var_b" "$var_c"

if [ "$#" -gt 0 ]; then
    echo 'Other operands:'
    printf '%s\n' "$@"
fi

Executando algumas vezes:

$ ./script.sh
var_a = 12
var_b = yellow
var_c = 0

$ ./script.sh -b "green tea" "hello world"
var_a = 12
var_b = green tea
var_c = 0
Other operands:
hello world

$ ./script.sh -c my other car is a cdr
var_a = 12
var_b = yellow
var_c = 1
Other operands:
my
other
car
is
a
cdr

$ ./script.sh -a -d
var_a = -d
var_b = yellow
var_c = 0

$ ./script.sh -a
./script.sh[15]: -'a' requires argument
command line parsing error

$ ./script.sh -a "boo!" "help!" -c
var_a = boo!
var_b = yellow
var_c = 0
Other operands:
help!
-c
    
por 17.02.2018 / 10:09

Tags