이것은 내 스크립트입니다.
load_1=15231
load_2=20547
load_3=24561
load_4=22874
f4=434
sum_1=`expr $load_1 + $f4`
sum_2=`expr $load_2 + $f4`
sum_3=`expr $load_3 + $f4`
sum_4=`expr $load_4 + $f4`
min=$sum_1
LIST1="1 2 3 4"
for x in $LIST1
do
if [ $sum_$x -lt $min ]
then
min=$sum_$x
f3=$x
fi
done
echo $min
echo $f3
다음 명령을 사용하여 스크립트를 실행할 때의 출력은 다음과 같습니다 bash -x
.
+ load_1=15231
+ load_2=20547
+ load_3=24561
+ load_4=22874
+ f4=434
++ expr 15231 + 434
+ sum_1=15665
++ expr 20547 + 434
+ sum_2=20981
++ expr 24561 + 434
+ sum_3=24995
++ expr 22874 + 434
+ sum_4=23308
+ min=15665
+ LIST1='1 2 3 4'
+ for x in '$LIST1'
+ [[ 1 -lt 15665 ]]
+ min=1
+ f3=1
+ for x in '$LIST1'
+ [[ 2 -lt 1 ]]
+ for x in '$LIST1'
+ [[ 3 -lt 1 ]]
+ for x in '$LIST1'
+ [[ 4 -lt 1 ]]
+ echo 1
1
+ echo 1
1
루프 변수 "x"의 값을 테스트 조건 변수로 대체한 sum_x
다음 $sum_x
의 값을 테스트 조건에 할당해야 합니다. 그러나 출력에서 볼 수 있듯이 'x' 값이 조건에 직접 적용됩니다. 나는 따옴표와 괄호의 다양한 조합을 시도했지만 아무것도 효과가 없었습니다. 도와주세요! !
답변1
$sum_$x
귀하의 질문은 다음의 연결 로 해석됩니다 .$sum_
$x
~$ for x in $LIST1; do echo $sum_$x; done
1
2
3
4
따라서 귀하의 질문입니다. 당신이 원하는 것은 사용하는 것입니다
~$ for x in $LIST1; do echo $((sum_$x)); done
15665
20981
24995
23308
답변2
나는 당신의 스크립트가 무엇을 해야 하는지 잘 이해하지 못하며 어떤 언어로 작성하는지 알려주지 않았습니다. 그래서 저는 bash를 가정할 것이며 귀하의 질문에 있는 값이 존재하지 않는다는 것을 알고 스크립트를 수행하지 않는다는 것을 알고 있습니다.아주 유용한 일을 해라.
일반적으로 변수 이름을 얻기 위해 문자열을 연결하는 것은 번거롭고 불필요합니다. 그냥 배열을 사용하세요:
#!/usr/bin/env bash
load=(15231 20547 24561 22874)
f4=434
for((i=0;i<${#load[@]};i++))
do
sums[i]=$((${load[i]} + $f4))
done
min=$((${sums[0]}))
for((i=1;i<${#load[@]};i++))
do
if [ "${sums[i]}" -lt "$min" ]
then
min="${sums[i]}"
f3="$i"
fi
done
printf "%s\n%s" "$min" "$f3"
답변3
- 귀하의 필요에 맞는 좀 더 배쉬적인 방법:
load_1=15231
load_2=20547
load_3=24561
load_4=22874
f4=434
line=`(set -o posix ; set) | grep load_ | sort -t = -n -k2 | head -1`
min=`echo $line | cut -d= -f2`
echo $((min+f4))
echo $line | cut -d= -f1 | cut -d_ -f2
그 결과는 다음과 같습니다.
15665 1
여전히 코드를 사용하고 싶다면 다음 단계를 따르세요.
LIST1
사용을 피할 수 있습니다for x in {1..4}
f3=1
설정되면 설정됩니다min
. 그렇지 않으면 예에서와 같이 설정되지 않습니다.
답변4
load_1=15231
load_2=20547
load_3=24561
load_4=22874
f4=434
min=0
f3=1
for n in 1 2 3 4
do [ "$((sum_$n=load_$n+f4))" -lt \
"$((min=min?min:sum_$n))" ] &&
min=$((sum_$n)) f3=$n
printf '$%s =\t%d\n' \
"sum_$n" "$((sum_$n))" \
min "$min" f3 "$f3"
done
수학 확장은 쉘 변수를 확장합니다.첫 번째. 완료되면 다음과 같은 명령문이 표시됩니다.
sum_[1234] = load_[1234] + f4
...여기서 괄호는 루프의 각 반복을 나타냅니다. 이는 문자열이 쉘 산술 확장에서 정수에 대한 변수 이름을 나타내기 때문에 유효한 산술 구문입니다. [ test ]
-so에 대한 인수 로 사용되더라도 현재 쉘 컨텍스트에서 이러한 변수를 설정하고 $sum_1
동시에 값으로 설정 합니다.15231그리고 $min
그것 과 비교하면 0
.
그러나 의 값은 결코 작지 않기 때문에 귀하의 값 은 에 $min
따라 조정되지 않습니다 .$sum_$n
$sum_$n
$min
산출
$sum_1 = 15665
$min = 15665
$f3 = 1
$sum_2 = 20981
$min = 15665
$f3 = 1
$sum_3 = 24995
$min = 15665
$f3 = 1
$sum_4 = 23308
$min = 15665
$f3 = 1
사실, 우리는 모든 것을 수학적으로 확장하고 테스트를 완전히 생략할 수 있습니다.
load_1=15231
load_2=20547
load_3=24561
load_4=22874
f4=434
f3=$((!(min=0)))
for n in 1 2 3 4
do echo \$min = "$((
min = ( min > ( sum_$n = load_$n+f4 ) )
? ( sum_$n + !( f3 = $n ) )
: ( min ? min : sum_$n )
))"; done
이는 각 반복에 대해 모든 변수를 적절하게 설정하지만 $min
매번 값으로만 확장됩니다. 다음과 같이 인쇄됩니다.
$min = 15665
$min = 15665
$min = 15665
$min = 15665