Para testar se você obteve valores para todas as variáveis e sair do contrário, use o teste -z
para testar strings vazias:
if [ -z "$one" ] || [ -z "$two" ] || [ -z "$three" ]; then
echo 'Did not get three values' >&2
exit 1
fi
O valor $#
é o número de parâmetros posicionais , geralmente argumentos de linha de comando (ou valores definidos pelo set
builtin). Eles estão disponíveis em $1
, $2
, $3
, etc. (ou coletivamente na matriz "$@"
) e não estão relacionados aos valores lidos pelo read
construído.
Para fazer com que seu script tome a entrada como argumentos de linha de comando em vez de lê-los interativamente (o que pode ser preferido se o usuário fornecer um ou vários caminhos, pois eles podem tirar proveito da conclusão de tabulação) para usar o script de outro script e não requer que haja um terminal conectado), use
if [ "$#" -ne 3 ]; then
echo 'Did not get three command line arguments' >&2
exit 1
fi
one=$1
two=$2
three=$3
O script, nesse caso, seria executado como
./script.sh a.plain /path/to/inputfile /path/to/outputfile
Se o processamento da entrada puder acontecer a partir da entrada padrão e se a saída puder ser enviada para a saída padrão (ou seja, se você não precisar os caminhos explícitos do arquivo de entrada e do arquivo de saída dentro do script), o script só precisa receber o primeiro parâmetro ( a.plain
ou b.complex
).
./script.sh a.plain </path/to/inputfile >/path/to/outputfile
O script então usaria a entrada padrão e os fluxos de saída padrão para entrada e saída (e consequentemente só precisa verificar um argumento de linha de comando único ).
Isso tornaria possível executar o script com dados enviados de outro programa e também permitiria mais pós-processamento:
gzip -dc <file-in.gz | ./script.sh a.plain | sort | gzip -c >file-out.gz