自更新 shell 腳本

問題

shell 文件 1.sh 內容以下:shell

num=1
let num++
echo $num

如何使下次運行的時候,num 能使用上次的計算值?code

方案

這裏不採用外部文件存儲,試着用重定向更新腳本自己。
既然要修改本身,先要獲得自身路徑。awk

  1. 獲得腳本路徑
path="$(dirname "$0")"
  1. 修改內容
awk -v num=$num  '/^num=[0-9]/{gsub("[0-9]+",num)} {print}' 1.sh
  • -v num=$num 把 shell 變量值傳入 awk 使用
  • /^num=[0-9]/ 匹配變量定義行
  • gsub("[0-9]+",num) 替換變量的賦值
  1. 保存
    失敗作法:awk '...' 1.sh > 1.sh,文件會被清空!杯具
    成功作法:awk '...{print >1.sh}' 1.sh
    因此,能在 awk 裏解決的,毫不拿到外面去,☺

代碼

#!/bin/sh
num=1
let num++
cd "$(dirname "$0")"
awk '/^num=[0-9]/{gsub("[0-9]+",num)} {print >self}' num=$num self="$0" "$0"

固然用 sed -i 也能夠,這裏用註釋定位待修改位置變量

number=5 #SAVE_NUMBER
let number++
sed -i "0,/.*#SAVE_NUMBER/s/.*#SAVE_NUMBER/number=$number #SAVE_NUMBER/" $0
相關文章
相關標籤/搜索