首页 > 解决方案 > 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(我的普通编程语言)中,您可以在任何地方设置变量(在函数中显式设置它们除外)

标签: bash

解决方案


有几个错误。

  1. 你在设置为 1之前回显 do_exit
  2. 你有fi & sleep 5;它使 if 语句成为子进程,因此你不能在父进程中使用该值
  3. -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

推荐阅读