Passando o parâmetro de texto unix shell (opcional) sem expansão

0

Eu quero escrever um script unix / linux updategit.sh com um parâmetro padrão para confirmar o git. updategit.sh deve ser compatível com POSIX. Espero que o POSIX resolva algumas das piores incompatibilidades dos shells do unix / linux.

Sintaxe: updategit.sh {$1}

{$1} significa que o parâmetro $1 é opcional.

1) Se nenhum parâmetro for passado para updategit.sh , a última ação no script deve ser:

git commit -m 'Patches #1023, #1016.4 .. .17 reapplied. See e-mail from Paul ([email protected]) send at 2016-01-26 08:56'

É suficiente passá-lo entre aspas simples quando o texto não contém uma única citação?

2) Deve ser possível passar um parâmetro opcional $1 to updategit.sh . A sintaxe natural seria incluir o parâmetro entre aspas duplas. Eu acho que isso não será possível. Eu quero ser capaz de obter o máximo possível de updategit.sh sem o shell destruindo o parâmetro de entrada e o comando falhar por causa do shell mexendo com a entrada.

A sintaxe natural seria algo assim:

$ ./updategit.sh "New template GetShape()"
$ ./updategit.sh "Patch #312.5 applied. See Eve's email ([email protected]) from 2016-02.29 09:43"
$ ./updategit.sh "Round to .5 fixed"
$ ./updategit.sh

É claro que o shell vai mexer com a entrada. Quão perto eu poderia chegar à sintaxe "natural" sem git commit -m $1 falhar? AFAIK o comando git commit -m $1 deve ser reescrito para algo mais robusto.

    
por ihatesh 04.03.2016 / 04:32

1 resposta

1

Tecnicamente, todos os argumentos para shell scripts são opcionais. Cabe ao script determinar se há argumentos ausentes e o que fazer sobre isso. Isso pode ser feito de várias maneiras, dependendo das suas necessidades. Para um script que tem apenas um argumento opcional, algo assim funcionaria:

#!/usr/bin/env sh
if [ ${#1} -eq 0 ]
then
    git commit -m "default message"
else
    git commit -m "$1"
fi

Isso verifica se o comprimento do primeiro argumento é zero e age de acordo. Se o primeiro argumento estiver faltando, ele contará como tendo comprimento zero. Você também pode verificar o número de argumentos comparando com $# .

Uma variação menor do script acima, que aproveita a substituição do argumento vazio, é:

#!/usr/bin/env sh
git commit -m "${1:-default message}"

Esse tipo de coisa é descrito aqui em "2.6.2 Expansão de Parâmetros".

    
por 04.03.2016 / 05:41