Обрабатывать пробелы в аргументах bash-скрипта - PullRequest
2 голосов
/ 06 апреля 2011

У меня проблемы с обработкой аргументов, которые содержат пробелы в скрипте my bash.

Сценарий

#!/bin/bash
for i in $*
do
    echo "$i"
done

Вызов (с 2 аргументами)

$ ./script.sh "a b" "c"

Фактический результат (как если бы было 3 аргумента)

a
b
c

Ожидаемый результат (как если бы было 2 аргумента)

a b
c

Может кто-нибудь объяснить, как получить ожидаемый результат?

Ответы [ 3 ]

6 голосов
/ 06 апреля 2011

Измените $* на "$@" в первой строке.

0 голосов
/ 02 июля 2013

Ответ на комментарий, оставленный в 2011 году о том, как назначить каждый аргумент переменной ...

Эта функция bash назначает каждый аргумент элементу в массиве. Затем они могут быть использованы в другом месте.

Рассматриваемая функция находит файлы определенного типа и затем извлекает их:

search "multi word search terms" txt

Соответствующие строки являются первыми 5. Мы инициализируем массив, перебираем передаваемые аргументы и присваиваем их как элементы в массиве. Затем на них ссылается функция, как требуется.

Таким образом, вы можете указать необязательный третий параметр для открытия файлов в редакторе по вашему выбору:

search "multi word search terms" txt mate

В переменной $ searchterm экранированы пробелы, поэтому grep примет ее как одну строку.

function search() {
        terms=();
        for i in "$@"
        do
                terms+=("$i")
        done

        file='*.'${terms[1]};
        searchterm=${terms[0]// /\\ };

        if [ -n "$3" ]; then
                find . -type f -name $file -exec grep -irl "$searchterm" {} \; | xargs ${terms[2]};
        else
                find . -type f -name $file -exec grep -irl "$searchterm" {} \;;
        fi
}

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 06 апреля 2011

То, что вы хотите, это $ @ для параметров (и вы должны заключить его в "") вместо $ *.

...