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'