Com grep
e substituição de processo :
#!/bin/bash
val1='sdb sdc sdd sde sdf sdg sdh sdi sdj sdk'
val2='sdb sdc sdf sdd sde sdg'
val3="$(grep -v -F -f <(printf "%s\n" $val2) <(printf "%s\n" $val1) | xargs)"
echo "$val1"
echo "$val2"
echo "$val3"
As substituições de processo com printf "%s\n"
são usadas para fazer as listas em var1
e var2 parecerem arquivos com uma entrada por linha para grep
. var2
é o "arquivo" de entrada para a opção -f
e var1
é o "arquivo" a ser usado. xargs
é usado para converter a saída de grep
de várias linhas em uma única string separada por espaço ... um truque preguiçoso, mas útil.
E aqui está a mesma coisa usando matrizes:
#!/bin/bash
val1=(sdb sdc sdd sde sdf sdg sdh sdi sdj sdk)
val2=(sdb sdc sdf sdd sde sdg)
val3=($(grep -vFf <(printf "%s\n" "${val2[@]}") <(printf "%s\n" "${val1[@]}")))
echo "${val1[@]}"
echo "${val2[@]}"
echo "${val3[@]}"