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