Passa stdin como argumento para o script bash

1

Em um script bash, quero fazer o seguinte:% $ script.sh < some_file

O some_file é um arquivo que tem 1 linha única que eu quero passar como um argumento para o meu bash script.sh
Como posso fazer isso?

    
por Jim 20.09.2017 / 10:16

3 respostas

1

Usando o read construído em shell, você pode ler dados de stdin e armazenar a entrada de leitura nas variáveis do shell:

$ echo foo bar baz | read a b c
$ echo $a
foo
$ echo $b
bar
$ echo $c
baz

Como você pode ver, read splits é inserido nos campos. Onde a entrada é dividida é determinada pela variável $IFS (o Input Field Seperator ). Ao definir $IFS para o valor vazio, a divisão de entrada é desativada e você pode salvar uma linha completa em uma variável:

$ echo foo bar baz | IFS= read foo
$ echo $foo
foo bar baz
    
por 20.09.2017 / 10:25
1

cat some_file | ./script.sh 'xargs'

    
por 20.09.2017 / 10:56
1

Três variações:

  1. Passe o conteúdo do arquivo na linha de comando e use-o no script.
  2. Passe o nome do arquivo do arquivo na linha de comando e leia o arquivo no script.
  3. Passe o conteúdo do arquivo na entrada padrão e leia a entrada padrão no script.

Transmitindo o conteúdo como um argumento de linha de comando:

$ ./script.sh "$(<some_file)"

Dentro do script:

some_data=$1

$1 será o valor do primeiro argumento de linha de comando.

Passando o nome do arquivo:

$ ./script.sh some_file

Dentro do script:

some_data=$(<"$1")

ou

IFS= read -r some_data <"$1"

Conectando entrada padrão ao arquivo:

$ ./script.sh <some_file

Dentro do script:

IFS= read -r some_data

A desvantagem dessa maneira de fazer isso é que a entrada padrão do script agora está conectada a some_file . No entanto, ele oferece muita flexibilidade para o usuário do script passar os dados na entrada padrão de um arquivo ou de um pipeline.

    
por 20.09.2017 / 11:47