eval
подходит, если вы используете его правильно:
Func1() {
eval "$1=\$str1"
}
Безопасно, пока Func1
вызывается только с имена переменных, которые вы хотите передать.
Как всегда, переменные нужно заключать в кавычки. И здесь $ str1
не нужно расширять перед передачей в eval
.
Если в Func1
могут быть переданы произвольные строки, которые не находятся под вашим контролем, тогда у вас возникнут проблемы со значениями вроде reboot; foo
, и вам потребуется очистить его следующим образом:
Func1() {
case $1 in
"" |\
*[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]* |\
[0123456789]* |\
BASH* | LD_* | PATH | IFS | ENV | SHELLOPTS | PERL5LIB | PYTHON_PATH |...)
echo >&2 "Can't set that variable"
return 1
esac
eval "$1=\$str1"
}
Однако составить полный список проблемных переменных - обреченная задача.
Из-за того, что OP цитирует выражение '! -name *. * '
превращается во второй аргумент find
. Итак, теперь
find
думает, что вы передали ему 2
имен каталогов, а именно, .
и безумное имя ! -name *. *
, поэтому он будет добросовестно попытаться рекурсивно перечислить все файлы / подкаталоги в этих двух. С .
Пока все хорошо, но когда придет время погрузиться в этот сумасшедший режиссер. ! -name *. *
не может, если он у вас нет. И даже тогда find
не будет делать то, что вы хотели.
Для этого вы должны указать соответствующие места:
find . ! -name '*.*'
или
eval find . '! -name "*.*"'
Попробуйте заключить только выражение в одинарные кавычки.
find . ! -name '*.*'