Pergunta de script de shell iniciante

0

Este programa Linux deve imprimir de 0 a 4. Mas não consigo encontrar erro neste código. Por favor ajude.

#!/bin/sh

a=0

while [ $a -lt 5 ]
do
    echo $a
    a='expr $a + 1'
done

Quando tento executá-lo, ele diz "Linha 5: [: muitos argumentos". Por favor ajude!

    
por Sparsh 17.10.2016 / 15:46

3 respostas

4

Você pode usar citações de backtick para substituição de comandos

a='expr $a + 1'
    
por 17.10.2016 / 15:51
1

Eu forneci três exemplos, os dois primeiros com while loops e o terceiro com um until loop. O primeiro exemplo usa uma sintaxe muito próxima do original, o terceiro é um pouco mais complexo, pois usa configurações dinâmicas para o contador máximo e uma matriz para iterar, embora as palavras (argumentos separados por espaço) passem uma de cada vez. Agora, esses são exemplos simples e pretendiam apenas responder suas perguntas diretas na linguagem de script do Bash, se você quiser exemplos mais avançados, veja o link anexado a um script que estou mantendo no GitHub para exemplos de loops aninhados entre outras técnicas de magia.

Exemplo um

#!/usr/bin/env bash
let _counter=0
let _max="5"
while [ "${_counter}" -lt "${_max}" ]; do
    echo "${_counter}"
    let _counter=++
done
unset _counter
unset _max

Exemplo de exemplo em execução

./example_one.sh
1
2
3
4
5

Exemplo dois

#!/usr/bin/env bash
_arr_args=( "${@}" )
let _counter=0
let _max="${#_arr_args[@]}"
while [ "${_counter}" -lt "${_max}" ]; do
    echo "${_arr_args[${_counter}]}"
    let _counter=++
done
unset _counter
unset _max

Exemplo de execução dois exemplo

./example_two.sh "$(seq 1 5)"
## same output as example one

Exemplo três (bônus)

#!/usr/bin/env bash
_arr_args=( "${@}" )
let _counter=0
let _max="${#_arr_args[@]}"
until [ "${_counter}" = "${_max}" ]; do
    echo "${_arr_args[${_counter}]}"
    let _counter=++
done
unset _counter
unset _max

Exemplo de exemplo três em execução

./example_three.sh "$(seq 1 5)"
## same output as example one

Notas para novos escritores de script Bash

  • pesquise variáveis / matrizes incorporadas e regras de substituição; economizará tempo, esforço e de tubulação desnecessária para outros programas.
  • procure shellcheck , ele está disponível na maioria das distribuições, e na forma de fonte de seus autores, e está integrado no Code Climate fire GitHub.
  • como iludido acima aqui está o link para um exemplo de um script que faz uso de ambos os tipos de loop mostrado acima, bem como a verificação automática de código. No entanto, a intenção dos scripts está bem além do escopo de responder à pergunta acima, então pesquise por "while" & "até" para encontrar as funções relevantes que usam essas chamadas.
  • bash ! = sh existem semelhanças, mas são diferentes, pessoalmente acho o bash a melhor escolha, porque é menos provável que seja bugado se receber um script sh onde faça coisas estranhas com a sintaxe bash.
por 17.10.2016 / 16:43
0

Você está atribuindo a string 'expr $a + 1' para a. Isso não é provável o que você quer. Basta alterar aspas simples para os backticks e isso funcionará:

a='expr $a + 1'

O acima deve responder sua pergunta. Abaixo estão alguns pensamentos adicionais:

Se a implementação de /bin/sh for Bash, você também pode considerar usar $(...) em vez de backticks. Isso tem várias vantagens: evita a confusão tipográfica entre aspas simples e backtick, o formulário $(...) pode ser aninhado e cada aninhamento está em seu próprio contexto de cotação (para que você possa fazer coisas como:

variable="$(somecommand -o "$file")"

Aqui está outra implementação:

#/bin/bash

declare -i a=0
while [[ $a -lt 5 ]]; do
   echo $a
   ((a++))
done

Observe que sh não é uma implementação. Portanto, para responder à sua pergunta com segurança, precisamos saber se sua intenção inclui portabilidade POSIX ou se você está interessado em uma implementação específica, como Bash , dash , tcsh , etc.

    
por 17.10.2016 / 16:03