[英]control the sorting in for loop BASH
有什么方法可以控制我運行 a, for d in *; 時發生的排序嗎? 做; 回聲 $i; 完畢; 在我的目錄中? 我有這個文件夾結構:
root/
|__CloudUtils/
|__ComponentSplit/
|__ComponentStatistics/
|__ETLManager/
|__MergeComponent/
|__NormalizeComponent/
|__Reducer/
而且我想更改順序,以便 mvn 將在 CloudUtils 之后立即編譯 NormalizeComponent。
for d in */ ; do
d=${d::-1}
mvn clean deploy -f "$d"
done
有沒有辦法做到這一點?
只有存在與您需要的排序順序相匹配的情況下,您才能控制排序結果; LC_COLLATE
可用於選擇要使用的排序——但在這種情況下,您的操作系統提供的所有排序都不會與您想要的行為相匹配。
您可以使用帶有否定斷言的 extglob將特定目錄排除在 glob 的結果之外,因此您可以對第一項和第二項進行硬編碼,並按照語言環境的排序規則設置提供的順序執行其他所有操作:
#!/usr/bin/env bash
[ -n "$BASH_VERSION" ] || { echo "ERROR: only bash is supported" >&2; exit 1; }
shopt -s extglob
for d in CloudUtils NormalizeComponent !(CloudUtils|NormalizeComponent)/; do
mvn clean deploy -f "${d%/}"
done
查爾斯回答的一個變體:
shopt -s extglob
exception='NormalizeComponent'
dirs=( !("$exception")/ )
dirs=( "${dirs[0]}" "$exception"/ "${dirs[@]:1}" )
for d in "${dirs[@]}"; do
echo "$d"
done
輸出
CloudUtils/
NormalizeComponent/
ComponentSplit/
ComponentStatistics/
ETLManager/
MergeComponent/
Reducer/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.