Не могу не поделится рецептом так как решения "в лоб" я не нашел. Ситуация следующая. В скрипте нужно ненавязчиво проверить установленны ли переменные окружение и если не установлены то установить. При все простоте формулировке задача сложнее чем кажется т.к. например надо учитывать что ряд переменных содержат набор значений. Приветствуйте мой велосипед, он же "деликатный экспорт"
functionsoftexport() { evaltmp_export_val=\$$1 if [[ $tmp_export_val == "" ]] then eval"export $1=$2" else if [ $(expr match $tmp_export_val $2) = 0 ] then eval"export $1=\$$1:$2" fi fi }
вызывать соответственно например так softexport LD_LIBRARY_PATH ${ORACLE_HOME}/lib
З.Ы. пишу скорее как памятку себе потому извините за отсутствие подробностей. Ежеели кому чего не понятно станет спрашивайте - отвечу.
Продолжаю корчить из себя лиспера. Поскольку часто в emacs, в запале страсти программирования путаю раскладку то и решил по быстрому набросать транслитератор(да, я знаю про xneur). Решил сделать его на CL и потом перевести на eLisp. И опять наткнулся на некую неполноценность elisp. Оказалось что коллекции и строки в нем не тоже самое, в отличие от CL. Ниже приведу код на том и на другом. CL мне нравится все больше. И даже loop который по началу показался чудовищным вдруг начинает нравится.
CommonLisp во все красе.
(defvar*latsym*"qwertyuiop[]asdfghjkl;'zxcvbnm,.`/QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?~")
(defvar*russym*"йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё")
(defvar*etalon-rus*"йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ№")
(defvar*ignore-syms*",./?:\";'{}[]")
(defun translit (bad-string bad-list good-list)
(let ((goot-string "")
(pos 0))
(loop for letter across bad-string
do (progn
(setf pos (position letter bad-list))
(if (equalp pos nil)
(setf goot-string (concatenate
'string goot-string (string letter)))
(setf goot-string
(concatenate 'string goot-string
(string (elt good-list pos)))))))
goot-string))
(defunfind-in-rus(line)
(loop for letter across line
do (if (equal (position letter *ignore-syms*) nil)
(return (position letter *etalon-rus*)))))
(defunreverse-lang(input-str)
(if (find-in-rus input-str)
(translit input-str *russym* *latsym*)
(translit input-str *latsym* *russym*)))
(format t "~s~%" (reverse-lang '"ghbdtn"))
Поскольку сейчас на досуге ковыряю Common Lisp то заглянув в свой .emacs пришел в легкий ужас от того что было сделано ранее. Ну и поскольку зуд в руках было не унять переделал все немного. Добавил функцию тригерного подсвечивания слов. Т.е. если слово не подсвечено оно подсвечивается по всему тексту. Если подсвечено то подсветка снимается. Удобно. В процессе создания меня ждало несколько обломов и разочарований.
1) Зачем было давать в elisp другие имена функциям имеющим сходное поведение в CL??
2) Не нашел аналога функции position из CL пришлось писать свой велосипед
3) Удаление элемента из списка. В доке по elisp сказано буквально следующее
— Function: delete object sequence
If sequence is a list, this function destructively removes all elements equal to object from sequence. For lists, delete is to delq as member is to memq: it uses equal to compare elements with object, like member; when it finds an element that matches, it cuts the element out just as delq would.
оказалось она ни разу не деструктивная.
В результате получилось следующее. Предыдущий вариант можно посмотреть в более ранних постах.