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.