Como escrever um script de shell usando o terminal?

0

Eu quero escrever um script de shell completo usando >> para anexar comandos a um arquivo. Por exemplo, considere o seguinte script como se tivesse sido criado com um editor.

echo Hello World, done
echo please enter the first number
read num1
echo please enter the second number
read num2
echo $num1 plus $num2 is 'expr $num1 + $num2'

Em uma janela de terminal, tentei digitar echo echo Hello World, "done" >> file.sh para gravar todas as linhas em um arquivo. Eu coloquei aspas ao redor de "done" para ter certeza de que quando eu executo o arquivo, o terminal não considera a palavra-chave "done". No entanto, quando eu verificar o arquivo para ver se eu fiz corretamente, a palavra-chave "done" não tem as aspas. Também a última linha no código acima, quando digitada em uma janela de terminal e anexada ao arquivo, todas as exibições de arquivo são echo plus is . Eu estou querendo saber por que as variáveis e a expressão expr não são anexadas ao arquivo. Eu basicamente quero recriar o código acima de uma janela de terminal. Estou executando o Ubuntu 12.04 com a versão bash 4.2.24

    
por programmerjc6 25.11.2018 / 06:26

3 respostas

2

tldr; o shell está interpretando os caracteres antes de anexar ao arquivo.

echo echo Hello World, "done" >> file.sh

O shell interpreta o " , removendo-os do padrão de echo . Portanto, você precisa fugir deles,

echo echo Hello World, \"done\" >> file.sh

ou, mais simplesmente, coloque tudo em ' .

echo 'echo Hello World, "done"' >> file.sh'

Dito isto, não sei ao certo o que você quer dizer com

to make sure that when I run the file, the terminal doesn't consider the keyword "done"

Um done após um echo não significa nada. O novo script irá imprimir apenas um literal done . Apenas teste!

Da mesma forma, para

echo $num1 plus $num2 is 'expr $num1 + $num2'

o shell interpreta as variáveis e expr antes anexa ao arquivo. Novamente, apenas coloque tudo em ' .

echo 'echo $num1 plus $num2 is 'expr $num1 + $num2'' >> file.sh

Dito isto, não faço ideia por que você gostaria de fazer isso. Apenas use um editor de texto. Vai ser complicado quando você quiser literal ' s no seu script.

    
por 25.11.2018 / 06:50
1

Tente a seguinte estrutura:

$ cat > file.sh << "EOF"
echo Hello World, done
read num1
echo please enter the second number
read num2
echo Sum of $num1 and $num2 is 'expr $num1 + $num2'
EOF
O

Linux from Scratch usa este método para fazer desde a criação de scripts à criação de arquivos. Se o done substituir o EOF , considere a possibilidade de escapar como sugere o Sparhawk.

    
por 25.11.2018 / 06:49
1

A maneira mais fácil de criar um arquivo de texto (que é o que é um shell script) de um shell interativo em um terminal usando redirecionamentos é simplesmente fazer

$ cat >filename

... e depois cole o texto que quiser ou comece a digitar (use >> em vez de > para acrescentar a um arquivo já existente). Quando terminar, pressione Ctrl + D .

Como um bônus extra, o shell também não interpretará as coisas que você cola ou digita no arquivo de texto dessa maneira. Se você usasse echo para inserir linhas individuais ou um aqui-documento para inserir múltiplas linhas, você teria que se lembrar de proteger o texto através do uso adequado de citações para evitar que o shell expandisse variáveis, seqüências de escape etc. do documento.

Para criar um script a partir de um script, use um documento aqui entre aspas

cat <<'END_SCRIPT' >filename
script
goes
here
END_SCRIPT

O problema que você está enfrentando em sua pergunta é que quando simplesmente prepending echo para linhas, o resto da linha ainda é interpretado pelo shell, a menos que você tome precauções extras.

    
por 25.11.2018 / 08:54