Substituição de bash com variável definida a partir de um padrão glob

10

O exemplo abaixo explica o problema. Por que o FILENAME é impresso corretamente quando é ecoado e percebido como um padrão ao usar substituição?

#!/bin/bash

FILEPATH_WITH_GLOB="/home/user/file_*"
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
echo $FILENAME                #file_1234
echo ${FILENAME:1:5}          #ile_*   <---why is this not ile_1
    
por TheMeaningfulEngineer 17.06.2015 / 15:50

1 resposta

15
FILEPATH_WITH_GLOB="/home/user/file_*"

Agora, FILEPATH_WITH_GLOB contém /home/user/file_*

FILENAME=$(basename "$FILEPATH_WITH_GLOB")

FILENAME contém file_* .

echo $FILENAME                #file_1234

$FILENAME sendo não-referenciado no contexto de lista, essa expansão passa pelo operador split + glob, de modo que é expandida para a lista de arquivos correspondentes: geração de nome de arquivo é executada na expansão de parâmetro .

echo ${FILENAME:1:5}          #ile_*   <---why is this not ile_1

Ainda é uma expansão de parâmetro sem aspas no contexto da lista, por isso ainda sofre split + glob. No entanto, aqui, o padrão ile_* não corresponde a nenhum arquivo, por isso, ele se expande para si mesmo.

O que você provavelmente quer aqui é:

shopt -s nullglob # have globs expand to nothing when they don't match
set -- /home/user/file_* # expand that pattern into the list of matching 
                         # files in $1, $2...
for file do  # loop over them
  filename=$(basename -- "$file")
  printf '%s\n' "$filename" "${filename:1:5}"
done

Ou você pode armazená-los em uma matriz:

shopt -s nullglob
files=(/home/user/file_*)

Se você se importa apenas com a primeira correspondência, ou se sabe que há apenas uma correspondência, você pode se referir a esse arquivo como $files . bash tem esse comportamento geralmente irritante que $files expande para ${files[0]} em vez de todos os elementos da matriz (um comportamento herdado de ksh , corrigido em zsh ), mas aqui, isso seria um comportamento desejado pela primeira vez.

    
por 17.06.2015 / 16:04