shell 中变量修改不生效问题
shell 中变量修改不生效问题
解决在 shell 中变量修改不生效问题。使用管道符时,while 循环会在子进程中运行,因此无法在父进程中看到修改后的变量。
示例:
直接在管道符中执行 while 循环,最后无法得到 prev_seconds 和 total_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"

浙公网安备 33010602011771号