verificar se um script de shell usa o argumento da linha de comando antes de executá-lo

1

Vamos ver o seguinte código:

#!/bin/bash
arg=$1
echo $arg

Se eu correr com argumento, ele imprime o argumento; se não, não faz nada. O que eu quero saber, é possível descobrir se é necessário um argumento de linha de comando ou não antes ou sem executá-lo?

    
por Fazle Rabbi 14.08.2017 / 16:51

3 respostas

5

Os scripts de shell compatíveis com

sh que usam os argumentos na linha de comando geralmente contêm $1 , $2 , $3 etc. ou $@ ou $* ou combinações dos mesmos. No entanto, isso não é necessário nem suficiente!

Isso ajusta o script e retorna todas as linhas que contêm esses tipos de strings:

grep '\$[1-9@*]' script.sh

Você pode obter falsos positivos de scripts que não usam argumentos de linha de comando, mas que contêm funções que recebem argumentos ou scripts que simplesmente contêm esses caracteres em cadeias de caracteres não avaliadas. Se o script contiver chamadas para awk , por exemplo, elas também poderão conter $1 etc., que não se referem aos argumentos de linha de comando do próprio script.

Você também pode procurar a string getopt no script para ver se o script usa getopt ou getopts para fazer a análise adequada da linha de comando.

Capturar os casos em que os argumentos da linha de comando podem ser usados implicitamente é um pouco mais difícil. Isso acontece, por exemplo, com for variablename; do ... done ou select variablename; do ... done . Mas se o script usou set para preencher os parâmetros posicionais explicitamente, isso não afeta nenhum argumento da linha de comando. Inspeção visual do script pode ser necessária para resolver isso.

Na "vida real", lê-se a documentação que o acompanha. Se por alguma estranha razão isso não estiver disponível, leia o código.

    
por 14.08.2017 / 17:02
3

Você não pode. Esta questão é, em geral, indecidível - não importa qual algoritmo você invente, pode-se chegar a um exemplo em que ele falharia. Apenas para molhar o apetite, considere os seguintes scripts - eles aceitam ou não um argumento?

# script 1
false && echo catch $1 if you can

# script 2
x='$'
y=1
eval echo $x$y
    
por 15.08.2017 / 07:13
0

O requisito não é significativo. Um programa recebe uma lista de argumentos de linha de comando e escolhe o que faz com ele. Um script de shell ou qualquer outro programa usa quantos argumentos de linha de comando quiser.

Você pode definir "pega argumentos de linha de comando" como "não faz nada útil quando chamado com 0 argumentos". Mas então você precisa definir "útil". O script de exemplo que você dá faz alguma coisa quando chamado sem argumentos: ele imprime uma linha em branco. Por que você define a impressão de uma linha em branco como não sendo útil?

Outra definição possível é que um programa "pega argumentos de linha de comando" se comporta de maneira diferente quando passa pelo menos um argumento de linha de comando do que com 0. Essa é a definição mais natural para mim, mas evidentemente essa não é a definição está usando desde que seu script de exemplo usa seu primeiro argumento para determinar o que produzir.

Você precisa repensar seu problema . O que você quer dizer com "leva argumentos de linha de comando"? Depois de definir seu problema, você estará mais perto de uma solução.

    
por 17.08.2017 / 02:10