Я думаю, что это проблема XY . Вам действительно не нужно создавать динамический оператор case
. Вы просто хотите использовать файл как простое хранилище ключей. Одним из решений является поиск в файле с помощью grep
, а затем извлечение значения с помощью cut
:
ret=$(grep "^$line" file.txt | cut -d = -f 2)
Вы должны игнорировать ^C
/ SIGINT
в функции обработки поста -:
preprocess(){
yes baa
}
postprocess(){
sed 's/a/z/g'
}
preprocess | { trap '' INT; postprocess; sleep 1; echo DONE; }
Когда вы запустите этот конвейер и нажмете ^C
, preprocess
будет уничтожен, но postprocess
продолжит работу, пока не будет использован весь вывод, произведенный preprocess
.
Обратите внимание, чтоtrap '' INT
(с пустой строкой в качестве обработчика )также будет игнорировать SIGINT
в подпроцессах; не заменяйте его, например. trap 'echo INT trapped' INT
, потому что это приведет к тому, что любой sed
и т. д. также будет уничтожен с помощью '^C', несмотря на то, что сигнал обрабатывается в родительском процессе.