我正在嘗試撰寫一個腳本,以便每次執行它時,它都會創建一批 10 個檔案,其數量從已經存在的最后一個或最大數量開始增加。我能夠撰寫一個腳本來創建 10 個檔案,但我不確定需要做什么,所以每次執行它時它都會從最后一個數字遞增。
#!bin/bash
num=1
while (($num <=10))
do
touch test$num
((num ))
done
它只創建 10 個檔案(test1、test2..)。我知道我需要進行檔案檢查并查看檔案是否存在,然后將最大的數字加 1。但是我從哪里開始呢?
uj5u.com熱心網友回復:
試試這個Shellcheck -clean 代碼:
#! /bin/bash -p
# Find maximum number already in use
max=0
for tf in test[0-9]*; do
num=${tf#test}
[[ $num != *[^0-9]* && num -gt max ]] && max=$num
done
# Create 10 files with numbers starting at max 1
for ((i=1; i<=10; i )); do
touch "test$((max i))"
done
num=${tf#test}test通過洗掉前綴從檔案名中提取數字。請參閱洗掉部分字串 (BashFAQ/100 (How do I do string operations in bash?))。[[ $num != *[^0-9]* && num -gt max ]] && max=$num首先檢查它$num是否真的是一個數字(即它不包含非數字字符。$num如果目錄包含名稱為test5a($num將是5a,這不是數字) 的檔案,則可能會出現非數字。(參見[[ ...]]在Bash 參考手冊中了解條件構造的模式匹配功能(=/==和!=)的詳細資訊。) 然后檢查變數中的數字是否大于目前看到的最大數字。(Bash 允許前綴用算術運算式省略(包括inside ),所以沒有必要寫)。[[...]]num$-gt[[...]]$num -gt $max
如果兩項檢查均通過,則更新到目前為止看到的最大數量。
uj5u.com熱心網友回復:
您必須使用 shell glob 來獲取以前的檔案;不幸的是,shell globing 的隱式排序不是數字的(例如test2將被認為大于) ,test10因此您必須使用其他方式來獲取前一批的最后一個數字。
#!/bin/bash
shopt -s extglob nullglob
prefix=test
batch_size=10
old_files=( "$prefix" ([0-9]) )
last=$(printf '%s\n' "${old_files[@]#"$prefix"}" | sort -nr | head -n 1)
declare -a new_files="( $prefix{$((last 1))..$((last batch_size))} )"
touch "${new_files[@]}"
對于初學者來說,我可能讓代碼過于復雜,所以這里有一些細節可以幫助你理解它:
shopt -s extglob nullglob允許使用 bash 擴展通配符并強制對不匹配的 glob 進行空擴展。old_files=( "$prefix" ([0-9]) )創建一個 bash 陣列,其中包含以給定開頭的所有檔案prefix,后跟一個或多個數字;順便說一句,該構造(...)不是標準的 glob,而是 bash 擴展的。"${old_files[@]#"$prefix"}"擴展到所有檔案,從它們的prefix.declare -a new_files="( $prefix{$((last 1))..$((last batch_size))} )"創建一個包含新一批檔案的陣列。
我使用一個技巧來擴展包含變數declare的bash ;range例如 bash 范圍是test{1..3},它擴展為test1 test2 test3,它的問題是您通常不能在大括號內使用變數(例如{$min..$max})。
這是一個更簡單的解決方案(但不太健壯且性能較差):
#!/bin/bash
last=$(
printf '%s\n' test* |
sed -nE 's/^test([0-9] )$/\1/p' |
sort -rn |
head -n 1
)
for ((i = last 1, j=last 10; i <= j; i ))
do
touch "test$i"
done
uj5u.com熱心網友回復:
我可以籠統地告訴你你需要什么。
你需要兩個變數。您已經擁有的每次執行計數變數,以及您需要將其存盤在腳本本身之外的總計數變數;理想情況下只是在另一個本地文本檔案中。
然后,將總計數變數匯入腳本,執行腳本,將總計數變數增加 10,然后將總計數匯出回單獨的檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475849.html
標籤:重击
