Se $ 1 == 3 e $ 2 == 5 então
grep .*sda[\"$@\"]
se transforma em
grep .*sda[3 5]
Qual é um problema devido à falta de cotações. Tente isso:
regex=".*sda($( IFS='|'; echo "$*" ))\>" # => .*sda(3|5)\>
blkid | grep -E "$regex" | ...
O \>
é um limite de palavra, para tornar a regex mais precisa.
Alguma documentação sobre os sabores de expressões regulares do GNU grep: