Запись сценария оболочки, чтобы взять вывод исполняемого файла и выполнить некоторое вычисление

Смотрите на круг дьявола, приложение, записанное для разрешения такой настройки на GNOME 2.

Обратите внимание, что, если/когда Вы перемещаетесь в GNOME 3, вещи могли бы работать очень по-другому …

1
16.11.2011, 15:02
3 ответа
Val=$(./a.out)
Val=`a.out`

Оба из них выполнятся a.out и сохраните вывод в Val.

Принятие удара или совместимой оболочки.

4
27.01.2020, 23:13
  • 1
    Спасибо за Ваш ответ. На самом деле я хочу знать точный "сценарий оболочки" для своего псевдокода как полностью незнакомый со сценарием оболочки. –  RIchard Williams 07.11.2011, 06:08

Вот Ваш код, переведенный в сценарий, который должен работать с ударом или ksh:

#!/bin/bash

# set min to some garbage value
min=1

N=$1
n=$2

for (( i=1; i<=$N; i++ )); do
   for (( j=1; j<=$n; j++ )); do
       val=$(/path/to/a.out)
       if (( $val < $min )); then
           min=$val; 
       fi   
   done
   arr=("${arr[@]}" "$min")
done

# Then I want to calculate the sum of the elements of the array 'arr'.
sum=0
for (( l=0; l<${#arr[@]}; l++ )); do
  sum=$( expr $sum + ${arr[$l]} )
done

echo "Sum of \$arr = ${sum}"

Теперь, это - фактический перевод Вашего кода. Можно хотеть измениться, как Вы присваиваете значения в $arr массива, поскольку Вы продвигаете $min на массив и не $val, и если $val является меньше, чем $min, то Вы изменяете значение продвижения $min к тому из $val (пока нижнее значение $val не найдено в последующем повторении цикла).

3
27.01.2020, 23:13
  • 1
    Благодарите за свой ответ. a.out таков, что произведет строку цифр, как произведено. Я должен преобразовать эту строку в переменную 'val'. Как сделать это? Например, a.out производит 12.34, как произведено, но 12.34 символьный массив и не плавание. Я хочу преобразовать это для плавания через сценарий оболочки, и у меня нет разрешения изменить код c, для которого a.out является исполняемым –  RIchard Williams 08.11.2011, 11:10
  • 2
    необходимо будет использовать стороннюю команду как bc или что-то, чтобы сделать это, поскольку удар не может врожденно обработать плавания. или Вы могли использовать Perl для записи сценария. –  Tim Kennedy 08.11.2011, 19:15
#!/bin/bash
# define as first and second parameter for script:
N=$1
n=$2
# declare as array:
declare -A arr 
k=0
min=7 # some garbage value

# for-loop with variable: Use 'seq'
for i in $(seq 1 $N)
# do...done - not curly braces:
do  
   for j in $(seq 1 $n)
   do 
     # already explained
     val=$(./a.out)
     # arithmetic evaluation in double parens:
     if (( val < min ))
     then
       min=$val
     fi
   done
   arr[$k]=$min
   k=$((k+1))
done 
array=${arr[*]}
addition=${array// /+}
echo $((addition))

Благодарность Gilles для полезной подсказки в комментарии.

0
27.01.2020, 23:13
  • 1
    Только от быстрого взгляда, ${arr[$k]}=$min должен быть arr[$k]=$min. Или Вы пытаетесь присвоить переменной, имя которой хранится в массиве? –  Gilles 'SO- stop being evil' 08.11.2011, 01:44

Теги

Похожие вопросы