Você ainda tem vários problemas no seu script.
Primeiro, um editor de texto é o caminho certo para criar um script 99% do tempo. Construí-lo manualmente linha por linha com comandos de eco é entediante e não oferece nenhuma vantagem. (O outro 1% abrange casos em que você está em um sistema que não tem um editor com o qual você esteja familiarizado ou onde há um bom motivo para usar um programa para gerar um script automaticamente, nenhum dos quais deve se aplicar em seu caso.) A primeira linha deve ser #!/bin/tcsh -f , não #!/bin/tcsh . O -f diz para não originar seus arquivos de inicialização ( .tcshrc , .cshrc , .login ), portanto, seu script será autocontido. A falta de -f provavelmente não causará nenhum problema, mas tê-lo é uma boa prática. (Nota: isso não se aplica a sh ou bash scripts; para esses shells, -f significa algo totalmente diferente.)
Esta linha:
sed "s/_/-/g" $sql
lê cada arquivo, alterando todos os sublinhados para hifens - mas a saída é gravada em stdout, não de volta ao arquivo de entrada. Os arquivos em si não são alterados. Desde então você faz isso:
echo You changed $n files
Eu presumo que isso não se encaixa nos seus planos.
A modificação de arquivos no lugar é, na verdade, moderadamente complicada. Eu faria algo assim:
sed "s/_/-/g" $sql > $sql.tmp && mv $sql.tmp $sql
Isso modifica o arquivo $sql , gravando a versão modificada em um arquivo temporário. Se for bem-sucedido, ele renomeia o arquivo temporário para $sql .
Há também uma opção -i para sed que fará algo semelhante; outra abordagem é:
sed -i.bak "s/_/-/g" $sql
A indentação é sua amiga. Tudo entre as linhas foreach e end deve ser recuado para mostrar a estrutura do seu código. (Eu mesmo uso 4 espaços; algumas pessoas preferem um número diferente de espaços ou usam abas.)
Por fim, o chmod 777 test não deve estar no próprio script test . Você precisa executar esse comando a partir da linha de comando, para tornar o script test executável. E 777 é uma má ideia; torna o seu script legível, executável, e gravável por todos no sistema. Use chmod +x test em vez disso.
Certifique-se de executar o script digitando ./test , não apenas test . (Sua pergunta diz que você já está fazendo isso.) Caso contrário, você pode executar o comando test embutido em vez do seu script. Não há nada de errado em nomear seu script test , contanto que você (a) use consistentemente a sintaxe ./test para invocá-la e (b) não tenha o diretório . no seu $PATH .
Se você estiver escrevendo muitos scripts, considere usar sh ou bash em vez de csh ou tcsh . Este ensaio explica porquê.
Finalmente (e esta pode ser a lição mais importante aqui), você não nos contou o que está tentando fazer. Eu acho que você quer modificar o conteúdo de certos arquivos, substituindo os sublinhados por hifens. Ou você quer mudar seus nomes em vez de seu conteúdo? É impossível ter certeza do que você está tentando fazer, porque tudo que você nos mostrou é um pedaço de código que não funciona . Não há nada de errado em nos mostrar um código que não funciona, mas não podemos aconselhá-lo sobre como corrigi-lo, a menos que você diga, em inglês, o que está tentando realizar.