export foo=bar
definirá a variável global $ foo para bar. Você também pode usar foo=bar ./test.sh
como um único comando para configurar foo para bar para test.sh.
Como posso definir variáveis para serem usadas em scripts também? Eles não precisam ser globais / de todo o sistema, apenas a sessão atual é suficiente. Mas, por algum motivo, eles parecem perdidos, mesmo que eu execute um script diretamente do meu terminal atual.
Exemplo:
foo=bar
echo "$foo"
saída: bar
No entanto, se test.sh contiver echo "$foo"
e eu:
foo=bar
./test.sh
A saída está vazia. Como faço para definir um escopo para variáveis temporárias com uma sessão de terminal que permaneça válida ao executar scripts da mesma sessão?
Quando você executa seu script de shell, ele é executado em uma nova instância de shell e não herda nenhuma variável instanciada na instância do shell interativo.
Variáveis específicas podem ser herdadas dessa maneira, chamadas de variáveis de ambiente. Você faz de uma atribuição de variável uma variável de ambiente usando export
, como export foo=bar
. Esta é a sintaxe bash, outras shells podem usar env
ou algum outro método.
Você também pode fazer com que o script de shell seja executado na mesma instância de shell, "sourcing". Você pode fazer isso com . test.sh
(anote o período) ou usando source test.sh
. Você pode fazer isso em sua sessão interativa ou pode fazer isso de dentro de um script de shell. Isso é realmente útil para a criação de "bibliotecas" de shell, nas quais você origina um conjunto de funções de shell ou definições de variáveis de um arquivo externo. Super prático.
Por exemplo:
#!/bin/bash
. /path/lib.sh
echo $foo # foo is instantiated in lib.sh
do_something # this is a shell function from lib.sh
em que lib.sh é:
foo="bar"
do_something() {
echo "I am do_something"
}
Outra opção seria passar a variável ao seu script como argumento.
foo=bar
./test.sh $foo
O problema então se torna o conteúdo de ./test.sh
Ele teria que echo $1
em vez de echo $foo
- o $ 1 indicando o primeiro argumento passado para o script.
Você deve executar a atribuição e o teste de eco srcipt no mesmo shell.
root@ijaz-HP-EliteBook-8560p:~# foo=bar
root@ijaz-HP-EliteBook-8560p:~# cat test.sh
#!/bin/bash
echo "$foo"
root@ijaz-HP-EliteBook-8560p:~# . test.sh
bar
esta é apenas uma maneira de fazer isso.
Tags shell-script variable