para loop no bash

0

Eu quero criar um loop for que seja executado de 1 a um número armazenado em uma variável. Mas isso produz esse erro:

Syntax error: Bad for loop variable

Este é o meu script:

#!/bin/bash

count_lines () 
{
  local f=$1  
  l='wc -l $f | sed 's/^\([0-9]*\).*$//''
}
echo "$0 counts the lines of code" 
l=0
while [ "$*" != ""  ]
do
        count_lines $1
        echo "$1: $l"
        shift
done
for(( i= 0 ; i <= ${l} ; i++))
do
   title=$(grep -oPm1 "(?<=<title>)[^<]+" <<< "$0")
   echo "$title"
done
    
por engineer 05.12.2015 / 23:56

2 respostas

1

Verifique se o script é executável e execute o script apenas digitando o comando, incluindo seu caminho. Por exemplo, se o script for chamado foo e estiver no diretório atual, execute

./foo

Dada a mensagem de erro, você está fazendo algo como sh foo . Isso executa o script em sh , não bash . sh em sua máquina é um shell diferente, provavelmente dash, que não suporta a sintaxe de loop for usada. Ao executar ./foo , seu script será executado pelo shell mencionado na primeira linha, que é bash.

Seu script é estranho em vários lugares:

  • Sempre coloque aspas duplas na variável substituições : "$1" , "$f" , etc.
  • Esse while [ "$*" != "" ] … loop é uma maneira muito indireta de iterar os argumentos do script. A maneira simples e idiomática é

    for x; do
      count_lines "$x"
    done
    

    ou

    for x in "$@"; do
      count_lines "$x"
    done
    
  • Não tenho certeza do que você está tentando fazer com title=$(grep -oPm1 "(?<=<title>)[^<]+" <<< "$0") ; "$0" é o caminho para o script, então você está pesquisando o regexp (?<=<title>)[^<]+ no caminho para o script, o que não faz muito sentido.
por 06.12.2015 / 00:14
0

O principal problema, acredito, é não testar se o arquivo realmente existe e obter uma contagem l que é inválida para o loop for .

Veja este script (muito modificado) semelhante para lhe dar algumas ideias:

#!/bin/bash

count_lines() {
if [[ -r $1 ]]; then     # if the file exist.
  l="$(wc -l "$1")"      # count the number of lines.
  l="${l%%[^0-9]*}"      # remove anything that is not a digit from the end.
else
  l=0
fi
}
echo "$0 counts the lines of code"

for file; do               # while there is an argument.
  count_lines "$file"    # execute the function above
  echo "$file: $l"       # print the number of lines.
done

echo "$(grep -oPm1 "(?<=<title>)[^<]+" "$0")"

Não consigo entender por que você tenta executar l times um comando (grep) para localizar title dentro de um arquivo. Uma vez é o suficiente.

Além disso, o comando grep está lendo o script (não um arquivo externo).

Como disse Gilles: corrija muito seu código e publique uma nova pergunta.

    
por 06.12.2015 / 02:47