bash - Bash - 如何在 if [] 条件内设置变量并在外部使用
问题描述
我正在努力解决这个问题。我有一个基本的 Bash 脚本:
#!/bin/bash
do_exit=0
while [ "$do_exit" == 0 ] ; do
echo $do_exit
do_exit=1
done
这行得通。但是,当我想do_exit=1
在一个if
条件内设置时:
#!/bin/bash
do_exit=0
while [ "$do_exit" == 0 ] ; do
free=`free -m | grep Mem | awk '{print $4}'`
if [ "$free" -gt 0 ]
then
echo $do_exit
do_exit=1
fi & sleep 5;
done
$do_exit
总是 0 ...所以永远不存在。我究竟做错了什么?当我想杀死脚本时,我对“中断”和“退出 0”有同样的问题 - 它只是继续!)
我一定是误解了变量在 Bash 中是如何工作的?在 Perl(我的普通编程语言)中,您可以在任何地方设置变量(在函数中显式设置它们除外)
解决方案
有几个错误。
- 你在设置为 1之前回显 do_exit
- 你有
fi & sleep 5;
它使 if 语句成为子进程,因此你不能在父进程中使用该值 -gt
用于数字比较,而不是字符串。
下面应该适合你。
#!/bin/bash
do_exit=0
while [ "$do_exit" == 0 ] ; do
free=`free -m | grep Mem | awk '{print $4}'`
if [[ $free -gt 0 ]]; then
do_exit=1
echo ${$do_exit}
fi
sleep 5;
done
您也可以break
使用 while 循环。检查这个:
#!/bin/bash
while true; do
free=$(free -m | grep Mem | awk '{print $4}')
if [[ $free -gt 0 ]]; then
break;
fi
sleep 5;
done
推荐阅读
- javascript - 如何在 Firebase Cloud 函数中执行“添加子项”事件?
- rest - Symfony REST 分页
- c# - 有没有办法更改以 Base-Style 定义的 ControlTemplate 的特定属性,而无需复制粘贴整个代码?
- vba - 用于在同一工作簿中的不同工作表上进行 Vlookup 的 VBA 代码
- c# - Azure Web App - 多个应用程序托管 - 访问 Web API,但它显示来自 Web App 的 web.config 的错误
- c++ - 如何根据输入分配变量类型?
- ios - 如何让用户在 Swift (iOS) 中保持登录状态?
- javascript - 我可以指定一个线程的最小 CPU 功率吗
- android - 布局高程属性不适用于 android studio 设计预览
- javascript - 为什么 "".split(" ").length 返回 1?