читайте с историей

Регулярные выражения и 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
11
25.06.2015, 07:16
2 ответа

Можно использовать 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 вызовы, но Вы, вероятно, найдете его функциональность истории слишком ограниченной (т.е. почти не существующий).

8
27.01.2020, 19:57

Чтобы скопировать отличный ответ Майка Строяна из этого старого сообщения списка рассылки :

Вы можете использовать "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
10
27.01.2020, 19:57

Теги

Похожие вопросы