while 루프에서 중첩 변수 테스트

while 루프에서 중첩 변수 테스트

while 루프 조건으로 중첩 변수를 삽입하려고 하는데 제대로 확장할 수 없습니다.

print_message() {
    timer=0
    timer_condition="$2"

    while [[ $timer_condition ]]; do
        sleep 1
        timer=$((timer+1))
    done
    echo "$1"
}

print_message 'Hello world, 5 seconds passed...' '$timer != "5"'
print_message 'Hello again, another 10 seconds passed...' '$timer != "10"'

예를 들어, 저는 2개의 매개변수를 받는 간단한 함수 print_message를 만들었습니다. $1은 인쇄할 메시지이고 $2는 메시지를 표시하기 위해 함수에 다른 조건을 제공할 수 있도록 while 루프에서 테스트할 조건입니다. 그러나 while 루프는 내용이 아닌 $timer_condition 자체가 true인지 테스트합니다. 이런 식으로 작동하게 하는 방법이 있나요?

while [[ $timer != "5" ]]; do

감사해요

답변1

원하는 작업을 수행하는 한 가지 방법은 다음과 같습니다.

print_message() {
    timer=0
    timer_condition="$2"

    while (( $timer_condition ))
    do
        sleep 1
        (( timer += 1 ))
    done
    echo "$1"
}

print_message 'Hello world, 5 seconds passed...' 'timer != 5'
print_message 'Hello again, another 10 seconds passed...' 'timer != 10'

~

답변2

당신은 그것을 사용할 수 있습니다 eval:

평가: 평가[매개변수...]

매개변수를 쉘 명령으로 실행하십시오.

ARG를 단일 문자열로 결합하고 결과를 셸에 대한 입력으로 사용하고 결과 명령을 실행합니다.

종료 상태: 명령의 종료 상태를 반환하거나 명령이 비어 있는 경우 성공을 반환합니다.

설명하기 위해 고안된 예:

foo=bar
expr='[[ $foo == bar ]]'
if eval "$expr"; then
  echo 'foo is equal to "bar"'
fi

스크립트를 '[[ $timer != 5 ]]'매개변수로 전달하고 사용하려면

while eval "$timer_condition"; do

하지만 참고하세요.eval 주의해서 사용해야 한다조심하지 않으면 악용되기 쉽기 때문입니다.

답변3

전달하려는 조건이 ls -1 | grep demo기존 파일의 위치라고 가정하면 다음과 같은 코드 조각이 작동합니다.demo

print_message() {
    condition="$2"

    if eval "$condition" > /dev/null
    then
        echo "$1"
    fi
}

print_message 'Found' 'ls -1 | grep demo'

관련 정보