adiciona um caractere antes de uma linha com o padrão correspondente [duplicado]

0

Eu tenho uma matriz que contém

line number 1
line number 2
line number 3
line number 4
line number 5

Então eu peço a entrada do usuário:

read userInput
echo $userInput

E então eu tento combinar a entrada do usuário, que é um número para minha matriz

for i in "${!array[@]}";do
if [["${array[$i]}"="$userInput"]]
then
    echo "~"
    echo " $i"
fi
done

Mas isso não funciona. A saída do desejo é esta:

4
line number 1
line number 2
line number 3
~line number 4
line number 5

Alguém pode me ajudar por favor?

    
por K.U 12.10.2016 / 22:52

1 resposta

1

O [[ .. ]] condicional precisa de espaços em branco em torno dos operadores e valores, ou seja,

[[ "${array[$i]}" = "$userInput" ]]
  instead of 
[["${array[$i]}"="$userInput"]]

(Este último é interpretado como uma palavra, e o shell tenta encontrar um comando com esse nome.)

Além disso, ${!array[@]} fornece os índices para o array. Não tenho certeza se é isso que você quer, já que no script você imprime o índice com echo $i , mas a saída de amostra parece conter a string armazenada na matriz. Se não precisar dos índices em particular, você pode usar apenas for value in "${array[@]}" .

Então, se você quer combinar um padrão parcial, você precisa explicitamente dizer ao shell que qualquer coisa antes e depois do padrão deve ser aceita: [[ "$var" = *$pattern* ]] (sem aspas ao redor do padrão). (Veja aqui )

Então, parafraseando um pouco:

A=("abc" "def" "ghi")
pat=e
for val in "${A[@]}"; do 
    [[ "$val" = *$pat* ]] && echo -n "~"
    echo "$val"
done

imprime

abc
~def
ghi
    
por 12.10.2016 / 23:13

Tags