2012-06-30 1 views
3

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

Например, предположим, что существует некоторая программа programname, которая имеет переключатель -switch, который принимает число с плавающей запятой в качестве входных данных. Таким образом, одна выполнение программы может прочитать:

programname -switch 0.05 

где 0,05 представляет собой конкретное значение передается на коммутатор -switch.

Теперь я хотел бы прочитать в виде текстового файла, который имеет список значений, которые я хотел бы передать, по порядку -switch в отдельных звонках programname. Мой текстовый файл test.txt может содержать следующие данные:

0.05 
3.19 
100.75 

Я хотел бы написать bash скрипт, который будет читать в текстовый файл и эффективно принимать эти вызовы в последовательности:

programname -switch 0.05 
programname -switch 3.19 
programname -switch 100.75 

Я имею в виду что-то вроде этого:

#!/bin/bash 
for i in {1..3} 
do 
programname -switch $x 
done 

Но то, что я должен ввести вместо $x? Другими словами, я не уверен, как читать в test.txt и предоставлять его содержимое, один за другим, до -switch при запуске цикла for. У тебя есть какой-нибудь совет? Спасибо!

ответ

1

values.txt:

0.05 
3.19 
100.75 

script.sh:

#!/bin/bash 

counter=1 
for value in $(cat values.txt) 
do 
    programname -switch $value -counter $counter 
    counter=$(expr $counter + 1) 
done 
+0

Спасибо! Я не указал это в своем первоначальном сообщении, но, к сожалению, мне все еще нужен целочисленный счетчик 'i', потому что я передам значение' i' (т.е. '$ i') в' programname' в другом коммутаторе (о котором я не указал в своем вопросе). Есть ли способ, которым мы можем поддерживать 'i'? – Andrew

+0

@ Андрей, я обновил свой ответ. – trojanfoe

+0

@Andrew Нет проблем. – trojanfoe

4

Там нет необходимости использовать какие-либо внешние утилиты. Инкремент счетчика и read могут быть выполнены вместе, как показано, или приращение счетчика можно перемещать в любом месте цикла.

while ((i++)); read -r value 
do 
    programname -switch "$value" -other "$i" 
done < test.txt 
+0

Спасибо, но это не работает для моего приложения, потому что '$ value' и' $ i' находятся в кавычках: '" $ value "и' $ $. К сожалению, для моего приложения мне нужно передать '$ value' как плавающую точку (обычный ввод), а не как строку в кавычках. – Andrew

+3

@Andrew: Ваше приложение никогда не увидит кавычки. Оболочка (Bash) использует их для защиты содержимого переменной, а затем удаляет их перед передачей содержимого в приложение. –

+0

Если вам нужно передать параметр как значение с плавающей запятой, а не строку, вам не повезло. Оболочка работает со строками. Даже execvp принимает только аргументы char *, поэтому вам придется очень много работать, чтобы передать что-то, кроме строки. –