Em um script de shell bash, $ 2 pode ser igual a vários argumentos na linha de comando ou eu preciso de $ 3, $ 4, etc ...?

0

No script de exemplo abaixo, ele é usado para enviar para um ou dois endereços de e-mail, dependendo de qual processo está usando o script. Preciso adicionar US $ 3 para contabilizar um endereço de e-mail adicional ou é US $ 2 suficiente?

(
for file in /usr/app/tst/$1/MS_CASE_ST*.csv;
do
   uuencode ${file} $(basename ${file})
done
) | mailx -s "MS_CASE_ST*.csv file contains data. Please Research" $2 

Um exemplo de como o script, example.sh, é executado:

$ ./example.sh output [email protected] [email protected]
    
por Emile 12.07.2017 / 18:51

3 respostas

7

$2 será sempre apenas o segundo argumento. $@ é uma matriz de todos os argumentos, portanto, se você quiser o segundo até o final, poderá fazer:

... | mailx -s "MS_CASE_ST*.csv file contains data.  Please research" "${@:2}"

o :2 está especificando um deslocamento na expansão do parâmetro ao expandir o $@ array

    
por 12.07.2017 / 18:58
1

Para oferecer suporte a vários destinatários com esse script específico, use $1 como elemento do caminho e, em seguida, desative isso na lista de parâmetros posicionais. Agora, a lista $@ contém apenas destinatários.

#!/bin/bash

dir=$1
shift

shopt -s nullglob

for file in "/usr/app/tst/$dir/MS_CASE_ST"*.csv; do
    uuencode "$file" "$( basename "$file" )"  # or uuencode "$file" "${file##*/}"
done | mailx -s 'MS_CASE_ST*.csv file(s) contains data. Please Research' "$@"

Algumas notas:

  • Tenha cuidado e aspas duplas em qualquer expansão de variável, ou você terá problemas quando um nome de caminho contiver espaços ou caracteres de globalização de nome de arquivo, etc. (e strings estáticas de aspas simples).

  • A citação de $@ as "$@" garante que ela se expanda para elementos citados individualmente.

  • Definindo a opção nullglob shell em bash , garantimos que o padrão de globbing que o loop usa se expande para nada se não corresponder a nenhum nome de caminho existente.

por 07.05.2018 / 11:27
0

Esta questão parece confundir os argumentos shell com o comando read . Eles são diferentes:

  1. O shell:

    set -- foo bar baz buzz zap bang ; echo $2
    

    A saída é apenas a segunda palavra:

    bar
    
  2. O comando read com dois nomes de variáveis:

    echo foo bar baz buzz zap bang | (read x y ; echo $y )
    

    Gera tudo incluindo e depois da segunda palavra:

    bar baz buzz zap bang
    
por 12.07.2017 / 21:22