Проблема не в том, что вы запускаете его в сценарии, а в том, что вы помещаете команду в переменную, а затем запускаете расширенную переменную. А поскольку расширение переменной происходит после того, как удаление кавычек уже выполнено, одинарные кавычки вокруг шаблона исключения никогда не удаляются ... и поэтому rsync завершает работу, исключая файлы с именами, начинающимися с 'и заканчивающимися на ~'. Чтобы это исправить, просто удалите кавычки вокруг шаблона (все это уже в двойных кавычках, поэтому они не нужны):
#!/bin/bash
cmd="rsync -rv --exclude *~ ./dir ./new"
$cmd # execute command
... говоря о том, почему вы помещаете команду в переменную перед ее выполнением? В общем, это хороший способ сделать код более запутанным, чем это должно быть, и вызвать странности разбора (некоторые даже страннее, чем это). Как насчет:
#!/bin/bash
rsync -rv --exclude '*~' ./dir ./new