запретить использование нескольких аргументов getopts

Пользователь richard очень хорошо описывает, что не так с вашей командой sed , а также дает правильный сценарий редактирования для выполнения действия, которое вы пытаетесь выполнить.

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

Команда sed r вставит содержимое файла в текущую позицию в потоке данных.

В командной строке sed можно написать

$ sed '115r /dev/stdin' index.html <data.in

, что даст тот же эффект, что и sed '115r data.in' index.html .. ..если данные, которые вы хотели вставить после строки 115, были сохранены в файле data.in .

/ dev / stdin - это специальный файл, содержащий все, что отправлено через стандартный ввод.

Вы также можете сделать (с оболочками, поддерживающими "здесь-строки"):

$ sed '115r /dev/stdin' index.html <<<"my string of stuff"

или

$ sed '115r /dev/stdin' index.html <<<"$myvariableofwonder"

Это также работает, как ожидалось, с конвейером из других команд, очевидно:

$ sed -n '1,10p' myfile | sed '115r /dev/stdin' index.html

Это трансплантирует строки с 1 по 10 из myfile в index.html в строке 115.

1
21.03.2016, 20:33
1 ответ

Вам необходимо инициализировать MODE как некоторое значение, отличное от SMTH, SMTH2 и SMTH3. Затем проверьте, находится ли MODE в начальном значении. Если нет, выдайте сообщение об ошибке и выйдите. Вы должны выйти после ошибки, иначе скрипт продолжит выполняться. Модифицированная версия вашего скрипта, приведенная ниже, должна помочь вам начать работу.

MODE=0
EMSG="More than one of -d, -e, -f has been specified"
while getopts "a:b:c:def" variable; do
case $variable in
a) a=$OPTARG ;;
b) b=$OPTARG ;;
c) c=$OPTARG ;;
d) if [ $MODE = 0 ] ; then MODE=SMTH  ; else  echo $EMSG  ; exit 1 ; fi ;;
e) if [ $MODE = 0 ] ; then MODE=SMTH2 ; else  echo $EMSG  ; exit 1 ; fi ;;
f) if [ $MODE = 0 ] ; then MODE=SMTH3 ; else  echo $EMSG  ; exit 1 ; fi ;;
esac
done
4
27.01.2020, 23:19

Теги

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