shell 中变量修改不生效问题

shell 中变量修改不生效问题

解决在 shell 中变量修改不生效问题。使用管道符时,while 循环会在子进程中运行,因此无法在父进程中看到修改后的变量。
示例:
直接在管道符中执行 while 循环,最后无法得到 prev_secondstotal_restart_num 变量的修改值。

#!/bin/bash

prev_seconds=""
total_restart_num=0

grep INFO log/admin.log | tail -n 10 | while read -r line; do
    timestamp=$(echo "$line" | awk -F 'INFO' '{print $1}')
    current_seconds=$(date -d "$timestamp" +%s)
    echo $current_seconds
    if [ "$prev_seconds" == "" ]; then
        prev_seconds=$current_seconds
        continue
    fi
    time_diff=$((current_seconds - prev_seconds))
    total_restart_num=$((total_restart_num + time_diff))
    prev_seconds=$current_seconds
done

echo "prev_seconds: $prev_seconds"
echo "total_restart_num: $total_restart_num"

使用进程替代(done < <(command) 是进程替代语法),表示将命令的输出传递给 while 循环,而不是通过管道,这样可以确保 total_restart_num 被正确修改并保留在父进程中。

#!/bin/bash

prev_seconds=""
total_restart_num=0

while read -r line; do
    timestamp=$(echo "$line" | awk -F 'INFO' '{print $1}')
    current_seconds=$(date -d "$timestamp" +%s)
    echo $current_seconds
    if [ "$prev_seconds" == "" ]; then
        prev_seconds=$current_seconds
        continue
    fi
    time_diff=$((current_seconds - prev_seconds))
    total_restart_num=$((total_restart_num + time_diff))
    prev_seconds=$current_seconds
done < <(grep INFO log/admin.log | tail -n 10)

echo "prev_seconds: $prev_seconds"
echo "total_restart_num: $total_restart_num"

posted @ 2025-03-11 18:30  守望人间  阅读(90)  评论(0)    收藏  举报