No mencionas qué shell planeas usar, así que supongo que bash, aunque estas son cosas bastante estándar en todos los shells.
Argumentos de archivo
Se puede acceder a los argumentos a través de las variables $1
- $n
( $0
devuelve el comando utilizado para ejecutar el programa). Digamos que tengo un script que solo cat
muestra un número de archivos con un delimitador entre ellos:
#!/usr/bin/env bash
#
# Parameters:
# 1: string delimiter between arguments 2-n
# 2-n: file(s) to cat out
for arg in ${@:2} # $@ is the array of arguments, ${@:2} slices it starting at 2.
do
cat $arg
echo $1
done
En este caso, estamos pasando un nombre de archivo a cat. Sin embargo, si desea transformar los datos en el archivo (sin escribirlo y reescribirlo explícitamente), también puede almacenar el contenido del archivo en una variable:
file_contents=$(cat $filename)
[...do some stuff...]
echo $file_contents >> $new_filename
Leer de stdin
En cuanto a la lectura de stdin, la mayoría de los shells tienen un estándar bastante read
integrado, aunque hay diferencias en cómo se especifican las indicaciones (como mínimo).
La página de manual de Bash Builtins tiene una explicación bastante concisa read
, pero prefiero la página de Bash Hackers .
Simplemente:
read var_name
Variables Múltiples
Para establecer múltiples variables, solo proporcione múltiples nombres de parámetros para read
:
read var1 var2 var3
read
luego colocará una palabra de stdin en cada variable, volcando todas las palabras restantes en la última variable.
λ read var1 var2 var3
thing1 thing2 thing3 thing4 thing5
λ echo $var1; echo $var2; echo $var3
thing1
thing2
thing3 thing4 thing5
Si se ingresan menos palabras que variables, las variables sobrantes estarán vacías (incluso si se configuraron previamente):
λ read var1 var2 var3
thing1 thing2
λ echo $var1; echo $var2; echo $var3
thing1
thing2
# Empty line
Avisos
Utilizo -p
flag a menudo para un aviso:
read -p "Enter filename: " filename
Nota: ZSH y KSH (y quizás otros) usan una sintaxis diferente para las indicaciones:
read "filename?Enter filename: " # Everything following the '?' is the prompt
Valores predeterminados
Esto no es realmente un read
truco, pero lo uso mucho junto con read
. Por ejemplo:
read -p "Y/[N]: " reply
reply=${reply:-N}
Básicamente, si la variable (respuesta) existe, devuélvala, pero si está vacía, devuelva el siguiente parámetro ("N").