Я хотел бы создать сценарий удара для выбора из .ics файлов в папке, затем делают 'нахождение и заменение' в том выбранном файле, затем сохраняют и переименовывают тот файл. Я починил некоторые вещи от поисков, но не знаю достаточно о том, что я делаю, чтобы заставить все это работать...
Вот то, что я имею для меню:
#!/bin/bash
echo "The following `*.ics` files were found; select one:"
# set the prompt used by select, replacing "#?"
PS3="Use number to select a file or 'stop' to cancel: "
# allow the user to choose a file
select filename in *.ics
do
# leave the loop if the user says 'stop'
if [[ "$REPLY" == stop ]]; then break; fi
# complain if no file was selected, and loop to ask again
if [[ "$filename" == "" ]]
then
echo "'$REPLY' is not a valid number"
continue
fi
# now we can use the selected file
echo "$filename installed"
# it'll ask for another unless we leave the loop
break
done
Это - код, который я в настоящее время использую для редактирования .ics файлов, но он изменяет ВСЕ .ics файлы в текущем каталоге:
#!/bin/bash
###Fixes all .ics files to give ALL DAY events rather than 0000-2359
####All .ics files
FILES="*.ics"
# for loop read each file
for f in $FILES
do
INF="$f"
##Change DTSTART:[yyyymmddThhmmss] to DTSTART;VALUE=DATE...##
sed -i[org] 's/DTSTART:2016/DTSTART;VALUE=DATE:2016/g' $INF
sed -i[org] 's/T[0-9][0-9][0-9][0-9][0-9][0-9]/ /g' $INF
###Remove DTEND:###
sed -i[org] 's/DTEND:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ /g'$INF
done
Как я могу поместить это все вместе для достижения моей цели??
Вы могли, возможно, структурировать его с помощью case
конструкция, как это:
#!/bin/bash
shopt -s nullglob
echo 'The following `*.ics` files were found; select one:'
select f in *.ics "Quit"; do
case $f in
"Quit")
echo "Quitting"
break
;;
*)
if [ -z "$f" ]; then
echo "Invalid menu selection"
else
echo "Doing something with $f"
fi
;;
esac
done
Изменение echo "Doing something with $f"
, чтобы сделать независимо от того, что Вы хотите с выбранным файлом - если бы это относительно сложно, я предложил бы переместить его в функцию оболочки. Не забудьте заключать его в кавычки т.е. "$f"
для предотвращения разделения слова.
Хорошо, я понял это. Вот мой код:
#!/bin/bash
shopt -s nullglob
echo 'The following `*.ics` files were found; select one:'
select f in *.ics "Quit"; do
case $f in
"Quit")
echo "Quitting"
break
;;
*)
if [ -z "$f" ]; then
echo "Invalid menu selection"
else
echo "Creating all-day events in $f"
##Change DTSTART:[yyyymmddThhmmss] to DTSTART;VALUE=DATE...##
sed -i.orig 's/DTSTART:2016/DTSTART;VALUE=DATE:2016/g' "$f"
sed -i.orig 's/T[0-9][0-9][0-9][0-9][0-9][0-9]/ /g' "$f"
###Remove DTEND:###
sed -i.orig 's/DTEND:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ /g' "$f"
fi
;;
esac
done
там способ повторить меню или после допустимого или после недопустимого ответа? (Извините, я - немного новичок в этом материале удара, пытаясь учиться, когда я иду.)