Как я произвожу предложение для пользователя, чтобы принять и использовать в качестве входа?

Я думаю, что необходимо использовать цикл

IFR=$'\0' # because you use -print0 on your find
for jpg_file in `find -iname '*.jpg' -print0`
do
  pdf_file=`echo "$jpg_file" | sed 's/jpg$/pdf/i'`
  if [ -e "$pdf_file" ]; then
    echo "$pdf_file exist"
  else
    echo "$pdf_file missing"
  fi
done
5
22.02.2014, 07:47
4 ответа

Вы хотите использовать bash вместо sh и -e и -i опции read встроенный:

#!/bin/bash -
echo "@@@@@@@@@@
@ Enter the new plarform name [for example: our-platform-7.26-2.17-res4]:
@@@@@@@@@@"
read -i "our-platform-7.26-2.17-res4" -e SuggestDefaultPlatform

echo "you chose $SuggestDefaultPlatform"

От help read в bash:

  -i text   Use TEXT as the initial text for Readline
  -e        use Readline to obtain the line in an interactive shell

Так, -i устанавливает значение по умолчанию и -e позволяет Вам вводить другого или изменять его. Вам не нужно дополнительное echo.

3
27.01.2020, 20:34
  • 1
    Обратите внимание, что это требует v4 bash. –  bahamat 15.02.2014, 23:14
  • 2
    :-i: недопустимая опция - я - рабочая версия 3.2.51, но это ответило бы на вопрос. чтение –  Mau 22.02.2014, 07:47

sh (как в sh спецификация языка), не идет со строчным редактором. Терминальные драйверы имеют элементарный строчный редактор, которые позволяют, чтобы клавиша Backspace и несколько других ключей отредактировали вводимую строку, но обычно не клавиши со стрелками.

Можно вставить значение по умолчанию в терминальный входной буфер драйвера с помощью TIOCSTI ioctl как:

printf 'Please enter the value: '
value=the-default
perl -MPOSIX -e 'require "sys/ioctl.ph"; tcflush 0,2;
  ioctl(STDIN, &TIOCSTI, $_) or die "$!\n"
    for split "", join " ", @ARGV' "$value"
IFS= read -r value

На read, содержание $value (the-default) будет вставлен как будто введенный.

Теперь, если Вы хотите более усовершенствованный строчный редактор, любят обеспеченный libreadline где можно использовать клавиши со стрелками, можно использовать вещи как rlwrap (не стандартная команда, хотя):

value=the-default
value=$(rlwrap -S 'Please enter the value: ' -P "$value" -o cat)

rlwrap обычно используется для добавления a readline- как строчные редакторы к приложениям, которые не имеют того. Выше мы добавляем строчный редактор к cat, и использование его в одноразовом режиме (-o), так, чтобы cat возвраты после одной строки вводятся (хотя можно все еще ввести больше чем одну строку с Ctrl+V, Ctrl-J как в bash.

Если Вы готовы использовать нестандартные оболочки, zsh или bash имейте builtins для того использования их собственного строчного редактора.

В zsh:

value=the-default
vared -p 'Please enter the value: ' value

В bash:

value=the-default
IFS= read -re -i "$value" -p 'Please enter the value: ' value
4
27.01.2020, 20:34
  • 1
    :-i: недопустимая опция - я - рабочая версия 3.2.51, но это ответило бы на вопрос. –  Mau 22.02.2014, 07:56

Короткий ответ: используйте -n флаг для эха.

Немного лучший ответ: значение по умолчанию echo поведение состоит в том, чтобы распечатать каждый аргумент стандарту, сопровождаемый символом новой строки. Эти символы специальны в этом, Вы не видите их, так как они - основной способ представить выходное форматирование. Все виды существуют для вкладок, новых строк, возвратов, и т.д.

Это было бы чрезвычайно утомительно, если бы у нас не было простого способа сказать нашу оболочку, когда мы хотели вставить вещи как вкладки или новые строки. Для преодоления этого эхо определяет определенные завершенные символы, чтобы иметь особое значение. \n новая строка средств, и \t средства произвести символ табуляции [ссылка].

В следующем примере Вы видите это в действии. Я использовал tr который переводит символ от одного набора до другого. Вывод покажет a - везде то, что это нашло новую строку:

echo "Hello\nFriends" | tr "\n" "-"
Hello\nFriends-

Заметьте, что мы нашли новую строку в конце, так как он был автоматически добавлен echo. Теперь, мы можем использовать -e отключить то поведение. Уведомление там не является никаким тире в конце:

echo -en "Hello\nFriends" | tr "\n" "-"
Hello\nFriends

Если Вы хотите сделать echo произведите значение escape-последовательностей (как \n выше), использовать -e:

echo -e "Hello\nFriends"
Hello
Friends
2
27.01.2020, 20:34
  • 1
    Правда, но не важный. OP хочет загрузить значение по умолчанию в переменную и позволить пользователю редактировать его. Ваш ответ просто дает способ не иметь новую строку, он не помогает в сохранении значения в переменную. –  terdon♦ 15.02.2014, 15:46
  • 2
    я предполагаю, что неправильно понял - я думал, что он говорил, что хотел иметь вход, появляются на той же строке как подсказка. –  tdk2fe 17.02.2014, 05:17
  • 3
    , жаль о недоразумении.. сообщите мне, как может я лучше мой вопрос –  Mau 26.03.2015, 06:08

Более новые версии bash (Я верю, по крайней мере, v4), может использовать readline вход и текст перед заливкой.

read -e -p "> " -i "our-platform-7.26-2.17-res4" SuggestDefaultPlatform

Если удар 4 не доступен, я использую rewrap* для этого. -P опция позволяет Вам предварительно заполнить текст строки..

SuggestDefaultPlatform=$(rlwrap -P "our-platform-7.26-2.17-res4" bash -c 'echo -n "> "; read response; echo $response')

Или в случае, может просто совершить нападки пользователь, входят для принятия значения или может отредактировать строку перед представлением. Это будет похоже на это:

> our-platform-7.26-2.17-res4_

Где _ курсор. Можно создать резервную копию полностью к o, но > останется как подсказка и не может быть переопределен. Только текст после подсказки находится в переменной.


* rlwrap самостоятельно, возможно, должен быть установлен также.

2
27.01.2020, 20:34
  • 1
    rlwrap: команда, не найденная - но Ваш ответ, ответила бы на вопрос. –  Mau 22.02.2014, 08:00
  • 2
    я действительно также уже упомянул это rlwrap возможно, должен быть установлен отдельно. В большом количестве случаев, которые могут быть легче, чем получение более новой версии bash поддерживать read -e. –  bahamat 23.02.2014, 10:00

Теги

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