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

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

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

  • Какие оболочки имеют функции, где «local» не изменяет экспортированные переменные для дочерних процессов?
  • Как ссылаться на скрипт-локальный словарь в сопоставлении Vim?
  • / bin / sh: определение функции импорта ошибок для `some-function '
  • Функция распознавания вызывающего абонента в bash
  • Как я могу загрузить несколько файлов в мой .bashrc?
  • что такое контекст подпрограммы?
  • Функции Bash, что-то странное происходит!
  • как предотвратить расширение псевдонимов `eval` до произвольного псевдонима и сохранить бесконечную защиту цикла от функции?
  • 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="" .

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