Если у вас такая задача, то она непонятно чему учит.
Слишком ненужные и длинные цепочки
Итак.
1. sed умеет сам открывать файлы. то есть вместо cat users.txt | sed можно просто sed users.txt
2. учитесь смотреть промежуточные значения, тот же ваш $line перед выполнением
3. Учитесь пользоваться sed без -i и смотреть промежуточный результат перед тем как он полезет в файл.
4. Что у вас с кавычками?
/^" $line ":/ это что?
вы пытаетесь пользоваться регулярками без понимания что это такое?
Вы вообще не понимаете как хотя бы одну строчку изменить через sed?
Тут даже чинить нечего, в строчке с sed все неверно.
for user in $(grep -vP "^(/s)*#" users.txt)
do
sudo sed -ir $user "/^$user:/s/\\bin\\sh/\\bin\\bash/" /etc/passwd
done