Existe uma camada extra de cotação ausente. Em sed &
tem um significado especial na substituição (significa a string correspondente). Então, para inserir um literal &
você escaparia dele uma vez, e para inserir um literal \&
, você escaparia da barra invertida ( \
) e do e comercial ( \&
), mesmo para a barra invertida antes de% código%. Isso te dá:
#!/bin/bash
dothis(){
rootpass="${1//\$/\\$}"
rootpass="${rootpass//&/\\\&}"
echo $rootpass
sed -i "s/root/$rootpass/g" test.txt
}
dothis 'my&rootpa$$';