2015-07-13 2 views
1

Я пишу скрипт bash, который будет использовать команду readline, чтобы поймать многострочный вход пользователя (список пакетов), но я не могу понять, как удалять символы (обратную косую черту) при вводе текста (предположим, что я сделал ошибка). Ниже приведена часть кода, который я подразумеваю.Как удалить символ в bash read -d многострочный вход?

read -d `echo -e "\e"` -p $'Give me a list:\n' PACKAGES 

\ e - символ выхода для выхода из многострочного ввода. Вот то, что я получил, когда я пытаюсь удалить символ (я перепробовал все методы, которые я знаю: Alt + обратный слэш, Ctrl + W, Ctrl + U):

# read -d `echo -e "\e"` -p $'Give me a list:\n' vPACKAGES 
Give me a list: 
line one 
line two 
line 3^H^W^U^H^ 

Как вы можете видеть^H, как обратный слэш был встроен,^W = ctrl + w, поэтому я не могу удалить любого символа только с помощью escape. Я попытался сыграть с флажками чтения, давая мне удалять символы, но enter больше не является выключателем линии.

Благодарим вас за ваши советы и помощь.

+2

Зачем это делать так? Почему бы просто не зациклиться до получения пустого или какого-либо другого терминатора? Вам нужно просто запросить один раз, чтобы он выглядел одинаково, но это также означает, что вы можете проверить строку за строкой, если хотите. –

+0

Можете ли вы, пожалуйста, привести простой пример, я не уверен, что я вас понял? Спасибо – LinenG

ответ

2

Я бы так не сделал этого. Я просто предлагаю значения в цикле, пока вы не получите пустую запись или какой-либо другой разделитель.

Что-то вроде этого (непроверенные):

pkgs=() 
printf 'Give me a list:\n' 
while read -e pkg; [ -n "$pkg" ]; do 
    # Validate package, etc., etc. 
    pkgs+=("$pkg") 
done 
# Use `${pkgs[@]}` ... 

Вы можете использовать любой другой тест вместо [ -n "$pkg" ] если у вас есть какой-то другой вход завершающего. (Например [ "$pkg" = "." ] испытать для . и т.д.)

Или, как Glenn Джекман правильно добавляет, с новее (4.0+) версии Баш новый readarray встроенный здесь можно использовать что-то вроде этого:

printf 'Enter package names, one per line: hit Ctrl-D on a blank line to stop\n' 
readarray -t pkgs 
+1

или с недавним bash: 'printf" Введите имена пакетов, по одному в строке: нажмите Ctrl-D на пустой строке, чтобы остановить \ n "; readarray -t pkgs' –

+0

Спасибо, Etan, решение - кусок пирога! Вы сделали меня счастливым! Постскриптум И хороший намек на чтение массивов bash ... – LinenG

Смежные вопросы