comprobar si un script de shell toma un argumento de command-line antes de ejecutarlo

Deje ver el siguiente código:

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

Si lo ejecuto con argumento, imprime el argumento; si no, no hace nada Lo que quiero saber es si es posible averiguar si se necesita o no un argumento de command-line antes o sin ejecutarlo.

sh guiones de shell compatibles con sh que usan los arguments en la command-line a menudo contienen $1 , $2 , $3 etc. o $@ o $* o combinaciones de los mismos. Sin embargo, esto no es necesario ni suficiente.

Esto greps el script y devuelve todas las líneas que contienen este tipo de cadenas:

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

Puede get falsos positivos de scripts que no toman arguments de command-line pero que contienen funciones que aceptan arguments, o scripts que simplemente contienen estos caracteres en cadenas no evaluadas. Si la secuencia de commands contiene llamadas a awk por ejemplo, estas también pueden contener $1 etc. que no se refieren a los arguments de la command-line del script en sí.

También puede search la cadena getopt en la secuencia de commands para ver si la secuencia de commands utiliza getopt o getopts para realizar un análisis adecuado de la command-line.

Capturar los casos en los que los arguments de la command-line se pueden usar implícitamente es un poco más difícil. Esto sucede, por ejemplo, con for variablename; do ... done for variablename; do ... done o select variablename; do ... done select variablename; do ... done . Pero si el script ha utilizado set para completar explícitamente los parameters posicionales, entonces esto no toca ningún argumento de línea de command. La inspección visual de la secuencia de commands puede ser necesaria para resolver esto.

En "la vida real", uno leería la documentation adjunta. Si por algún extraño motivo no está disponible, entonces lea el código.

No puedes. Esta pregunta es, en general, indecidible; no importa qué algorithm invente, uno puede encontrar un ejemplo en el que fallaría. Para satisfacer tu apetito, considera los siguientes guiones: ¿toman una discusión o no?

 # script 1 false && echo catch $1 if you can # script 2 x='$' y=1 eval echo $x$y 

El requisito no es significativo. Un progtwig recibe una list de arguments de línea de command y elige qué hace con él. Un script de shell o cualquier otro progtwig toma tantos arguments de línea de command como quiera.

Podría definir "toma arguments de línea de command" como "no hace nada útil cuando se lo llama con 0 arguments". Pero entonces necesitarías definir "útil". El script de ejemplo que usted da hace algo cuando se le llama sin arguments: imprime una línea en blanco. ¿Por qué define la printing de una línea en blanco como no útil?

Otra posible definición es que un progtwig "toma arguments de línea de command" si se comporta de manera diferente cuando pasa al less un argumento de línea de command que con 0. Esta es la definición más natural para mí, pero evidentemente esa no es la definición que estás usando ya que su script de ejemplo usa su primer argumento para determinar qué mostrar.

Debe replantear su problema . ¿A qué te refieres con "toma arguments de línea de command"? Una vez que haya definido su problema, estará más cerca de una solución.