我试图插入一个嵌套变量作为 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'