Как указывает dj_segfault, оболочка может сделать большую часть этого за вас. Похоже, вам придется прибегнуть к чему-то внешнему для строчной строчки. Для этого у вас есть много вариантов, таких как perl one-liners выше и т. Д., Но я думаю, что tr, вероятно, самый простой.
# first, strip underscores
CLEAN=${STRING//_/}
# next, replace spaces with underscores
CLEAN=${CLEAN// /_}
# now, clean out anything that's not alphanumeric or an underscore
CLEAN=${CLEAN//[^a-zA-Z0-9_]/}
# finally, lowercase with TR
CLEAN=`echo -n $CLEAN | tr A-Z a-z`
Порядок здесь несколько важен. Мы хотим избавиться от подчеркивания и заменить пробелы подчеркиванием, поэтому мы должны быть уверены, что сначала удалили подчеркивание. Ожидая передачи вещей в tr до конца, мы знаем, что у нас есть только буквенно-цифровые и подчеркивания, и мы можем быть уверены, что у нас нет пробелов, поэтому нам не нужно беспокоиться о том, что специальные символы интерпретируются оболочкой.