簡體   English   中英

控制for循環BASH中的排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM