Регулярные выражения и grep
то, что является Вами поиск.
Мы соответствуем любой неанглийской букве или цифре или /
(потому что это - часть каждого пути).
if [[ -n "$( pwd | grep -o -P "([^a-zA-Z0-9\/])*" )" ]]; then
echo "error"
fi
sed
могло быть применимым в этом случае также.
Если может заменить все корректные символы в ${WD}
с ''
и посмотрите, если что-то оставляют. Если получившая строка имеет ненулевую длину - ${WD}
не корректно.
Так, если мы ожидаем только /
, числа и английские буквы.
if [[ -n "$( pwd | sed -r -e 's/([a-zA-Z0-9\/])*//g' )" ]]; then
echo "error"
fi
Можно использовать rlwrap
для этого, если Вы не возражаете устанавливать программное обеспечение.
Вы, вероятно, захотите сохранить отдельный файл истории, который только поддерживает историю для конкретной подсказки в Вашем сценарии (т.е. постарайтесь не смешиваться с историей команд оболочки пользователя).
Вот пример, который мог бы работать на Вас:
#!/bin/sh
# Save in rlwrap_example.sh
HISTORY=$HOME/.myscript_history
USERINPUT=$(rlwrap -H $HISTORY sh -c 'read REPLY && echo $REPLY')
echo "User said $USERINPUT"
$ ./rlwrap_example.sh
hello
User said hello
В вышеупомянутом сценарии пользователь может использовать весь GNU readline функциональность с историей, врученной от — и сохраненный в — ~/.myscript_history
. Настройте по мере необходимости.
С другой стороны, можно использовать удар read -e
, который включает readline для read
вызовы, но Вы, вероятно, найдете его функциональность истории слишком ограниченной (т.е. почти не существующий).
Чтобы скопировать отличный ответ Майка Строяна из этого старого сообщения списка рассылки :
Вы можете использовать "history -r", чтобы прочитать файл в историю оболочки и "history -s", чтобы добавить каждую прочитанную вами строку в историю. Затем используйте history -w, чтобы сохранить историю обратно в файл. Вот пример редактирования строки чтения в стиле vi.
#!/bin/bash
history -r script_history
set -o vi
CMD=""
while true
do
echo "Type something"
read -e CMD
history -s "$CMD"
echo "You typed $CMD"
case "$CMD" in
stop)
break
;;
history)
history
;;
esac
done
history -w script_history
echo stopping