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.