Как вы можете назначить позиционные параметры, передаваемые в переменную внутри скрипта в bash? - PullRequest
2 голосов
/ 05 декабря 2010

В нашем назначении сценариев класса нам нужно передать любое количество каталогов в качестве позиционных параметров, и наш скрипт (в конце) будет вычислять, отображать и сохранять в файл определенную информацию о каталогах, передаваемых в качестве параметров.Нам, в свою очередь, необходимо выполнить несколько тестов для имени файла, в который мы хотим сохранить наши результаты.

Мой вопрос, без сомнения, простой, мне интересно, как я беру информацию, хранящуюся в $@и передать его в переменную, которую я могу затем использовать для всех необходимых мне испытаний.

Ответы [ 4 ]

3 голосов
/ 05 декабря 2010

Вы можете использовать цикл for для перебора массива $@ как:

for arg in "$@"
do
   # use $arg
done     
0 голосов
/ 05 декабря 2010

Вы также можете ссылаться на аргументы в $@, что-то вроде массива. Это один, но вы не можете использовать индексы массива. Однако вы можете использовать нарезку массива:

echo ${@:3:1}    # $@ is ONE-based

будет echo третий аргумент.

echo ${@:4:3}

будет echo четвертый, пятый и шестой аргументы.

Кстати, «подписками» $@ являются $1, $2 ... $# Последний, $#, является количеством аргументов. $0 имеет особую роль. Он содержит имя и путь к сценарию.

Вы также можете назначить все это (или даже его части) массиву, с которым вы можете использовать подписку.

some_array=("$@")
echo ${some_array[3]}      # the fourth element (ZERO based)
echo ${some_array[3]:4:3}  # 5th, 6th and 7th chars of the fourth element
echo ${some_array[@]:4:3}  # 5th, 6th and 7th ELEMENTS
echo ${some_array[@]: -1}  # the last element (notice the space)
0 голосов
/ 05 декабря 2010
for i in $@; do echo $i; done

где вы заменяете echo $ i на то, что вы хотите сделать с каждым аргументом.

0 голосов
/ 05 декабря 2010

$ @ - это переменная. Так и $ _ и $ 1, $ 2, ...

Похоже, что то, что вы хотите сделать, может быть достигнуто с помощью "shift" и цикла ("for" или "while") В качестве альтернативы просто используйте:

for i in $@; do ...; done

Для справки:

shift: shift [n] The positional parameters from $N+1 ... are renamed to $1 ... If N is not given, it is assumed to be 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...