Префикс каждого аргумента с -o в BASH

Как префикс -p для каждого аргумента, переданного моей функции?

Модификация самих аргументов и создание нового массива прекрасны.

  • Как убить процесс, запущенный как демон?
  • Прочитать файлы в сценарии оболочки ничего не распечатывает?
  • Фильтрация результата из команды
  • Использование переменной внутри последовательности команд в bash для дополнения существующей строки - синтаксическая ошибка или ошибочный дизайн?
  • Создавать журнал истории для рабочего каталога в bash
  • Bash и / или Zsh: Возможно ли настроить режим вставки Vi для создания привязки, которая перемещает определенное количество символов?
  • Есть ли правильный способ перечислить подкаталоги текущего каталога?
  • «Отладка» с bashdb: почему я теряю команду echo после перехода на простой скрипт?
  • 3 Solutions collect form web for “Префикс каждого аргумента с -o в BASH”

    Это должно работать хорошо даже для сложных аргументов с пробелами и худшими:

     #!/bin/bash new_args=() for arg do new_args+=( '-p' ) new_args+=( "$arg" ) done for arg in "${new_args[@]}" do echo "$arg" done 

    Контрольная работа:

     $ ~/test.sh foo $'bar\n\tbaz bay' -p foo -p bar baz bay 

    Поместите аргументы в массив и используйте подстановку шаблонов bash на них с подстановкой массива и сопоставлением префикса:

     ARGS=("$@") echo ${ARGS[@]/#/-p } 

    Это заменяет начало каждого arg с -p<space> .

    К сожалению, это не работает должным образом, если в ваших аргументах есть пробелы. Пространства сохраняются должным образом с помощью ARGS=("$@") , но не тогда, когда вы выполняете расширение ${ARGS[@]/#/-p } . Вы можете поместить двойные кавычки вокруг этого расширения, но затем вы получите -p arg1 как один аргумент, а не два аргумента.

    Если вам не нужно использовать -p<space> , просто -p тогда двойные кавычки вокруг расширения должны работать нормально. Экспериментируйте с и без двойных кавычек вокруг расширения, чтобы увидеть, что лучше всего подходит для вас.

    Вы можете сохранить пробелы в расширении ${ARGS[@]/#/-p } если вы установите переменную IFS в пустую строку!

     # sample code ( set -- 1 2 3 'arg with spaces' $'bar\n\tbaz bay' printf 'oldIFS: %q\n' "$IFS" IFS="" #IFS=" " printf 'newIFS: %q\n' "$IFS" ARGS=("$@") ARGS=( ${ARGS[@]/#/-p } ) for ((i=0; i < ${#ARGS[@]}; i++)); do echo "$i: ${ARGS[i]}" done ) 

    Внутри функции вы можете ограничить область измененной переменной IFS этой функцией, используя declare IFS="" .

    Linux и Unix - лучшая ОС в мире.