Você pode usar citações de backtick para substituição de comandos
a='expr $a + 1'
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!
Você pode usar citações de backtick para substituição de comandos
a='expr $a + 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.
#!/usr/bin/env bash
let _counter=0
let _max="5"
while [ "${_counter}" -lt "${_max}" ]; do
echo "${_counter}"
let _counter=++
done
unset _counter
unset _max
./example_one.sh
1
2
3
4
5
#!/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
./example_two.sh "$(seq 1 5)"
## same output as example one
#!/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
./example_three.sh "$(seq 1 5)"
## same output as example one
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. 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. 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.
Tags shell-script