실행 파일의 출력을 얻고 일부 계산을 수행하는 쉘 스크립트를 작성하십시오.

실행 파일의 출력을 얻고 일부 계산을 수행하는 쉘 스크립트를 작성하십시오.

저는 쉘 스크립트에 익숙하지 않습니다. 다음 의사 코드에 대한 쉘 스크립트를 작성하고 싶습니다.

min=some garbage value
for(i=1 to N){  // N and n will be taken as input for the shell script. 
   for(j=1 to n){
       val= './a.out' // call the executable a.out and take the output in val
       if(val<min)    // a.out is a random number generator script
           min=val; 
   }
   arr[k++]=min;
}
// Then I want to calculate the sum of the elements of the array 'arr'.

쉘 스크립트를 통해 이를 어떻게 수행할 수 있습니까? a.out글쎄, 출력으로 숫자 문자열이 생성됩니다. 이 문자열을 변수로 변환해야 합니다 val. 어떻게 해야 하나요? 예를 들어 출력이 a.out생성되지만 부동 소수점이 아닌 문자 배열입니다. 쉘 스크립트를 통해 이를 부동 소수점으로 변환하고 싶지만 실행 파일의 C 코드를 변경할 수 있는 액세스 권한이 없습니다.12.3412.34a.out

#!/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)
       val2=`echo $val | bc`    // is this the correct syntax?
       if (( $val2 < $min )); then
           min=$val2; 
       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}"

위의 코드는 나에게 작동하지 않습니다.

답변1

Val=$(./a.out)
Val=`a.out`

이들 둘 다 실행되어 a.out출력을 Val.

bash 또는 호환 가능한 쉘을 가정합니다.

답변2

다음은 코드를 bash 또는 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}"

이제 이것은 코드의 실제 번역입니다. $val 대신 $min을 배열에 푸시하므로 $arr 배열에 값을 할당하는 방식을 변경할 수 있습니다. $val이 $min보다 작으면 운반되는 $min의 값이 변경됩니다. $val 값으로 넘어갑니다(후속 루프 반복에서 더 낮은 $val 값이 발견될 때까지).

답변3

#!/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에게 감사드립니다.

관련 정보