2013-05-12 2 views
2

У меня есть Баш скрипт, принимающий несколько файлов в качестве входных данных, которые смешиваются с вариантами различного скрипта, например:Открыть файл в Баш скрипте

bristat -p log1.log -m lo2.log log3.log -u 

Я создал массив, в котором я сохранить весь индекс, где я может найти файлы в вызове сценария, так что в этом случае было бы arrat из 3-х элементов, где

arr_pos[0] = 2 
arr_pos[1] = 4 
arr_pos[3] = 5 

Позже в сценарии я должен называть «голова» и «Grep» в этих файлах и я попробовал этот путь

head -n 1 ${arr_pos[0]} 

, но я получаю эту ошибку нон выполнения

head: cannot open `2' for reading: No such file or directory 

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

+0

Возможно, вы пытаетесь получить доступ ко второму аргументу как-то с двойной заменой. вы можете проверить «shift» http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html – abasu

+0

@abasu Я знаю стандартный метод получения аргумента из вызова скрипта ($ X, где X позиция аргумента), но это не работает. –

ответ

2

Проблема заключается в том, что в ${arr_pos[0]} хранится индекс, в котором у вас есть имя файла, а не имя самого файла - поэтому вы не можете просто head его. Массив, хранящий ваши аргументы, дается [email protected].

Возможный способ доступа к данным, вы хотите это:

#! /bin/bash 

declare -a arr_pos=(2 4 5) 
echo ${@:${arr_pos[0]}:1} 

Выход:

log1.log 

Расширение ${@:${arr_pos[0]}:1} означает, что вы принимаете значения, начиная от индекса ${arr_pos[0]} в массиве [email protected] , к элементу индекса ${arr_pos[0]} + 1 в том же массиве [email protected].

Другой способ сделать это, как указано @flaschenpost, в eval индексу, которому предшествует $, так что вы получите доступ к массиву аргументов. Хотя он работает очень хорошо, он может быть опасным в зависимости от того, кто будет запускать ваш скрипт, поскольку они могут добавлять команды в строку аргументов.

В любом случае, вы можете попробовать пропустить весь массив аргументов в начале скрипта, хешировать значения, которые вы найдете, чтобы у вас не было проблем при попытке получить каждое значение позже. Вы можете выполнить цикл, используя for + case ... esac, и сохранить значения в ассоциативных массивах.

+0

$ {@: $ {arr_pos [0]}: 1} 1 что означает? Если я прав, я пытаюсь «достичь» элемента $ {arr_pos [0]} в вызове скрипта ($ {@: ...}) –

+1

@ArrigoPierotti Я добавил объяснение в ответ. – Rubens

+0

Кажется, он работает! Благодаря! –

2

Я думаю, что eval - это то, что вам нужно.

#!/bin/bash 

arr_pos[0]=2; 
arr_pos[1]=4; 
arr_pos[2]=5; 

eval "cat \$${arr_pos[1]}" 

Для меня это работает.

 Смежные вопросы

  • Нет связанных вопросов^_^