Parâmetros de expansão e posicionais do shell

3


Eu quero fazer um script equivalente a zgrep ou bzgrep , mas usando tar .

Fiz duas tentativas muito semelhantes e gostaria de saber se existe uma melhor e se poderiam ser melhoradas ou vão falhar por algum motivo que não consiga ver. Eu sei como usar tar e bzip2 , mas eu costumava ter alguns problemas com a expansão do shell.

Primeiro usando $@ :

#!/bin/bash
FILE_IN="${@: -1}"; ## Take last arg (file name) 
echo "FILE_IN: $FILE_IN"; 

INPUT_PARAMS="${@%%$FILE_IN}"; ## Take all args, but last (options and pattern)
echo "INPUT_PARAMS: $INPUT_PARAMS"; 

### Here I have to treat $INPUT_FILE before using grep (skipped) ###  

grep "$INPUT_PARAMS" "$FILE_IN"; 
exit $?; 

Segunda variável usando (quase o mesmo acima, apenas algumas diferenças):

#!/bin/bash
ARGS="$@" 
FILE_IN="${!ARGS[@]: -1}"; ## Take last arg (file name) 

INPUT_PARAMS=${ARGS%%$FILE_IN};

### From here is identical 

Ambos parecem funcionar, mas eu dei uma olhada no script para bzgrep e é muito mais complicado. Então, isso me faz pensar que meus scripts não funcionam.

Alguma ideia? Eles podem ser melhorados?

    
por Albert 23.12.2014 / 12:47

1 resposta

4

Você precisa de uma matriz se quiser armazenar mais de um argumento:

file_in="${@: -1}"
input_params=("${@:1:$#-1}")

Ou:

file_in="${@: -1}"
input_params=("$@")
unset 'input_params[-1]'

Ou com apenas sh de sintaxe:

n=$#
for file_in do
  shift
  [ "$((n = n - 1))" -gt 0 ] || break
  set -- "$@" "$file_in"
done
# input_params in "$@"

(todas as variáveis maiúsculas devem ser reservadas para variáveis de ambiente).

    
por 23.12.2014 / 13:01