在 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"'

作为示例,我创建了一个简单的函数 print_message,它接受 2 个参数:$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

评估:评估[参数...]

将参数作为 shell 命令执行。

将 ARG 组合成单个字符串,使用结果作为 shell 的输入,并执行生成的命令。

退出状态:返回命令的退出状态,如果命令为空,则返回成功。

一个人为的例子只是为了说明:

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'

相关内容