Atribui valores ou string a uma variável no script linux

1

Estou tentando atribuir a saída do comando basename de um arquivo à variável "filename". paths é um arquivo que contém o local do caminho, por exemplo, /root/home/david/mynote

$FILE is = mynote . grep é obter o caminho completo /root/home/david/mynote e basename é extrair apenas o mynote e atribuí-lo à variável filename .

filename=basename 'grep $FILE House/paths'

Com a linha de comando acima, o valor de filename está sempre vazio quando eu digito echo $filename .

    
por ibi 03.12.2012 / 01:56

2 respostas

2

Em geral, no BASH você salva a saída de comandos para uma variável de uma destas maneiras:

foo=$(ls /usr)

ou

foo='ls /usr'

Quanto à sua pergunta, se você tiver um arquivo chamado foo.txt cujo conteúdo é assim:

/usr/
/usr/games
/usr/games/cowthink
/usr/games/cowsay
/usr/games/fortune
/usr/games/enemylines7
/usr/games/enemylines3
/usr/lib32
/usr/lib32/libgdbm_compat.so.3.0.0
/usr/lib32/libfusion-1.2.so.9.0.1

então isso deve fazer o que você precisa:

while read FILE; do filename='basename "$FILE"'; echo "$filename"; done < foo.txt

Se, em vez disso, você quiser pesquisar um padrão específico (por exemplo, "mynote") no arquivo, faça:

grep mynote foo.txt|while read FILE; do filename='basename "$FILE"'; echo "$filename"; done

EXPLICAÇÃO:

while read FILE; do {something}; done < foo.txt

Este comando lê todas as linhas do arquivo foo.txt e salva seu conteúdo na variável $FILE . Em seguida, executa {something} uma vez para cada linha do arquivo.

Nesse caso, {something} é este comando:

filename='basename "$FILE"'; echo "$filename"  

Ele executa basename no conteúdo da variável $FILE e salva o resultado na variável $filename . Observe as aspas ( " ) em torno de $FILE , elas garantem que o comando funcione para nomes de arquivos contendo espaços. Finalmente, usa echo para imprimir o conteúdo de $filename .

ATUALIZAÇÃO:

Depois de ver sua outra outra pergunta , entendo o que você está tentando fazer. O que você precisa é isto:

filename=$(basename 'grep $FILE CourseWork/paths') 
    
por 03.12.2012 / 02:04
2

Este é um exemplo perfeito de como você deve parar de usar a sintaxe de backtick deprecated no bash:

filename=$(basename $(grep $FILE House/paths))

Veja o link

Observação: para proteger contra caminhos que possam conter espaço em branco, coloque alguns itens entre aspas duplas:

filename=$(basename "$(grep "$FILE" House/paths)")

A razão pela qual a variável está vazia é esta: quando a shell vê

filename=basename 'grep $FILE House/paths'
  1. o shell primeiro executa o comando grep (suponha que, para ilustração, o comando retorne "/ foo / bar / myfile")
  2. o shell tenta então executar "/ foo / bar / myfile", temporariamente definindo a variável de ambiente filename com o valor baseline para a duração de esse comando - o shell não contém uma variável filename .

Isto é documentado em silêncio na referência bash em Ambiente

The environment for any simple command or function may be augmented temporarily by prefixing it with parameter assignments, as described in Shell Parameters. These assignment statements affect only the environment seen by that command.

    
por 03.12.2012 / 04:02