Endereçamento de parâmetros positivos
Vamos esclarecer algo primeiro: os argumentos da linha de comando quando se referem a scripts bash são chamados de "parâmetros posicionais", e são variáveis como $1
, $2
, $3
e assim por diante. Esse é o vocabulário que vou usar aqui.
De acordo com a sintaxe correta do shell, os parâmetros posicionais aparecem após o comando (alguns podem dizer duh, obviamente, mas a sintaxe é importante):
command a b c
Suponha que command
seja seu script my_script.sh
. A partir do script, você pode executar comandos individuais em parâmetros como echo $1
e echo $2
. Você também pode trabalhar em todos deles imediatamente através de loop. Por exemplo, seu script simples pode ser assim:
#!/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
Endereçando a parte do nome do arquivo
O fato de que os parâmetros posicionais podem ser qualquer coisa - números ou texto - deixa a interpretação do que é suposto ser para o autor do script. Se string de texto é nome de arquivo, então naturalmente ele deve existir em algum lugar nos sistemas de arquivos (ao contrário dos arquivos anônimos, pipes ou soquetes [precisam ser citados aqui]).
Digamos que você chame o script como my_script "this_is_my_file.txt". Simple way to test whether
this_is_my_file.txt 'se o nome do arquivo existente for:
test -f "$1"
ou
[ -f "$1" ]
Por quê? $1
Porque é o primeiro parâmetro posicional. Por que test
ou [
? Porque esse é o mesmo comando. De lá você pode usá-lo com
if [ -f "$1" ]; then
echo "$1" exists
fi
ou
[ -f "$1" ] && echo "$1" exists
Naturalmente, um bom roteiro apropriado seria emitir um erro se o arquivo não existir e deixar o script sair com ele.
Uma das coisas importantes no script é desenvolver seus próprios hábitos. Como você não pode prever qual nome de arquivo seu usuário fornecerá ao script, pode ser qualquer coisa, o que também significa que pode começar com -
. Por exemplo, -afilename
. Esses nomes de arquivos geralmente quebram scripts e comandos regulares que precisam lidar com parâmetros posicionais. Caso você espere ou exija especificamente que o nome do arquivo exista no diretório de trabalho atual , é uma boa idéia usar ./
antes da variável.
if [ -f ./"$1" ]
Mesmo que seu usuário coloque explicitamente ./
, isso funcionará de qualquer maneira:
$ test -f ././input.txt && echo "YES"
YES
Se estivermos lidando com o nome do arquivo que também inclui o caminho para o arquivo, isso não será um problema - a última barra antes do nome do arquivo em /path/to/-difficult_name.txt
separará o nome do arquivo do restante do caminho.
... para ser editado e expandido posteriormente ...