Я думаю, что необходимо использовать цикл
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
Вы хотите использовать 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
.
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
Короткий ответ: используйте -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
Более новые версии 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
самостоятельно, возможно, должен быть установлен также.
rlwrap
возможно, должен быть установлен отдельно. В большом количестве случаев, которые могут быть легче, чем получение более новой версии bash
поддерживать read -e
.
– bahamat
23.02.2014, 10:00
bash
. – bahamat 15.02.2014, 23:14