Armazenando comandos em arquivos

0

Estou tentando armazenar comandos em um arquivo, para que eu possa facilmente chamar o arquivo usando o bit de código abaixo;

./test

Eu preciso executar esse código;

Set n=0 ; foreach sql ( *_*.sql)
foreach? sed “s/_/-/g” $sql
foreach? @ n ++
foreach? End
echo You changed $n files

Eu digito o seguinte:

set n = 0 > test
foreach sql ( *_*.sql) >> test

Quando eu chego a este ponto, eu avisto uma linha em branco aparecer dentro do terminal, então eu digito as 3 linhas seguintes cegas;

foreach? sed “s/_/-/g” $sql
foreach? @ n ++
foreach? End

Eu termino com:

echo 'echo You changed $n files' >> test

Quando terminar, o arquivo de saída contém apenas isto:

foreach? sed "s/_/-/g" $sql
foreach? @ n ++
foreach? end
echo You changed $n file

Faltando totalmente os comandos set e o início do loop foreach. O que estou perdendo aqui? ou simplesmente não é possível?

EDITANDO

#!/bin/tcsh
set n=0
foreach sql ( *_*.sql )
sed "s/_/-/g" $sql
@ n ++
end
echo You changed $n files
chmod 777 test
    
por r0bb077 05.03.2012 / 23:53

3 respostas

3

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.

    
por 07.03.2012 / 04:13
5

Experimentar o que você está fazendo na linha de comando do shell é repleto de problemas. Você tem que echo e redirecionar todas linha e você tem que citar qualquer metacaracteres shell para que eles não sejam interpretados pelo shell atual e não torná-lo no arquivo que você está criando. É melhor usar um editor de texto para editar seu arquivo test e inserir os comandos do shell diretamente lá.

    
por 06.03.2012 / 01:42
0

Como sugerido, use um editor para escrever scripts de shell.

Aqui as correções para sua versão editada :

Você precisa escrever set n=0 em vez de n=0 para se livrar da mensagem de erro "comando não encontrado",

foreach sql ( *_*.sql ) em vez de foreach sql *_*.sql

e end em vez de End .

Você precisa de cotas normais " em vez de para citar os parâmetros para sed.

    
por 07.03.2012 / 00:40

Tags