Как мне взять имя файла в командной строке в качестве аргумента? [закрыто]

0
09.02.2018, 03:52
2 ответа

Direccionamiento de parámetros positinales

Aclaremos algo primero :Los argumentos de línea de comando -cuando se refieren a scripts de bash se denominan "parámetros posicionales", y son variables como $1, $2, $3, etc. Ese es el vocabulario que usaré aquí.

De acuerdo con la sintaxis de shell adecuada,los parámetros posicionales aparecen después del comando (algunos podrían decir duh, obviamente, pero la sintaxis es importante):

command a b c

Supongamos que commandes su script my_script.sh. Desde el script, puede ejecutar comandos individuales en parámetros como echo $1y echo $2. También puede trabajar en todos de inmediato a través de bucle for. Entonces, por ejemplo, su script simple podría verse así:

#!/bin/sh
# Note important difference between /bin/sh and /bin/bash
# https://askubuntu.com/q/141928/295286

echo "$1"

# for loop will substitute each $1, $2,$3 value into i each time
for i
do
    echo "$i"
done

Direccionamiento de parte de nombre de archivo

El hecho de que los parámetros posicionales puedan ser cualquier cosa -números o texto -deja la interpretación de lo que se supone que es al autor del guión. Si la cadena de texto es nombre de archivo, entonces, naturalmente, debe existir en algún lugar de los sistemas de archivos (a diferencia de los archivos anónimos, conductos o conectores [necesita cita aquí] ).

Digamos que llamas al script como my_script "this_is_my_file.txt". Simple way to test whethereste _es _mi _archivo.txt `es un nombre de archivo existente que sería:

test -f "$1"

o

[ -f "$1" ]

¿Por qué? $1Porque es el primer parámetro posicional. ¿Por qué testo [? Porque ese es el mismo comando. Desde allí, puede usarlo con

if [ -f "$1" ]; then
    echo "$1" exists
fi

o

[ -f "$1" ] && echo "$1" exists

Por supuesto, lo apropiado para una buena secuencia de comandos sería emitir un error si el archivo no existe y dejar que la secuencia de comandos se cierre con eso.

Una de las cosas importantes en la escritura es desarrollar sus propios hábitos. Debido a que no puede predecir qué nombre de archivo le dará su usuario a la secuencia de comandos, podría ser cualquier cosa, lo que también significa que podría comenzar con -. Por ejemplo, -afilename. Dichos nombres de archivo a menudo rompen scripts y comandos regulares que tienen que lidiar con parámetros posicionales. En caso de que espere o requiera específicamente que exista el nombre de archivo en el directorio de trabajo actual , es una buena idea usar ./antes de la variable.

if [ -f./"$1" ]

Incluso si su usuario pone explícitamente ./esto funcionará de todos modos:

$ test -f././input.txt && echo "YES"
YES

Si estamos tratando con un nombre de archivo que también incluye la ruta al archivo,eso no será un problema -la última barra antes del nombre de archivo en /path/to/-difficult_name.txtseparará el nombre del archivo del resto de la ruta.

...para ser editado y ampliado más adelante...

2
28.01.2020, 02:43

Cuando se llama a un script con argumentos, estos se pasan al script como parámetros posicionales . Estos parámetros se pueden llamar usando $1, $2... ${10}, ${11}Tenga en cuenta que se requieren corchetes :para cualquier parámetro de dos dígitos.

Además, $@y $*se pueden utilizar para representar todos los parámetros, donde:

($*) Expands to the positional parameters, starting from one. When the expansion is not within double quotes, each positional parameter expands to a separate word. In contexts where it is performed, those words are subject to further word splitting and pathname expansion. When the expansion occurs within double quotes, it expands to a single word with the value of each parameter separated by the first character of the IFS special variable. That is, "$*" is equivalent to "$1c$2c…", where c is the first character of the value of the IFS variable. If IFS is unset, the parameters are separated by spaces. If IFS is null, the parameters are joined without intervening separators.

y

($@) Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" …. If the double-quoted expansion occurs within a word, the expansion of the first parameter is joined with the beginning part of the original word, and the expansion of the last parameter is joined with the last part of the original word. When there are no positional parameters, "$@" and $@ expand to nothing (i.e., they are removed).

Aquí hay un script que muestra un ejemplo de esto:

guión

#!/bin/sh

echo "My arguments are $@"

echo "$1 -- $2 -- $3 -- $4 -- $5 -- $6 -- $7 -- $8 -- $9 -- $10"

echo "Correct parameter 10 is ${10}"

en acción

$./script one two three four five six seven eight nine ten
My arguments are one two three four five six seven eight nine ten
one -- two -- three -- four -- five -- six -- seven -- eight -- nine -- one0
Correct parameter 10 is ten

Manual de referencia de Bash 3.4 Parámetros de shell

0
28.01.2020, 02:43

Теги

Похожие вопросы