조건부 연산자를 사용할 때 정렬 순서는 무엇입니까?

조건부 연산자를 사용할 때 정렬 순서는 무엇입니까?

나는 파일 이름 목록을 처리한 다음(그림과 같이 glob 확장 사용 for f in *) 해당 목록의 하위 집합을 파일로 출력하는 bash 스크립트를 작성했습니다. 그런 다음 파일의 내용을 배열로 읽고 문자열을 비교하기 위해 명백한 <AND 연산자를 사용하여 >특정 파일 이름에 대한 간단한 이진 검색을 수행했습니다 .

이 스크립트가 Linux, MacOS, MinGW 등과 같은 다양한 환경에서 작동하기를 원한다는 점을 고려하면(비록 이식성이 떨어지는 환경을 사용하지만 [[) stat내 질문은 다음과 같습니다.

  1. 파일 내용을 정렬해야 합니까( sortbash 코드 사용 또는 추가), 아니면 glob 확장이 모든 환경에서 항상 정렬됩니까?
  2. 조건부 연산자는 sort확장(또는 그 이후)과 동일한 "순서"를 사용합니까?

    (어떤 상황에서?) 이후에 확장되거나 반환되지만 sort조건부 연산자를 사용하는 것은 이전에 발생합니까? 이 문제를 해결하려면 어떤 옵션을 사용해야 합니까?file10.txtfile2.txtfile10.txtfile2.txtsort

  3. 내 파일 이름 중 일부가 유니코드인 경우 고려해야 할 사항이 있나요?

  4. 특정 버전의 bash를 사용하는 데 문제가 있나요?
  5. LC_COLLATE위 사항에 영향을 미치 나요 ?

분명히 이진 검색이 예상대로 작동하려면 연산자의 정렬 "방법"과 일치하는 파일 내용이 필요합니다.

답변1

예, 글로벌 확장은 항상 정렬됩니다.
bash에서 (에서 LESS=+/'^ *Pathname Expansion' man bash)

경로 이름 확장...단어는 패턴으로 처리됩니다.패턴과 일치하는 파일 이름의 알파벳순 목록으로 대체됩니다.

이것은 또한POSIX glob에 의해 지정됨:

...경로 이름은 LC_COLLATE 범주의 현재 설정에 정의된 정렬 순서로 정렬됩니다.

참고 1: GLOB_NOSORT플래그가 설정되지 않은 경우. 이 경우 순서는 지정되지 않습니다.

노트 2: 정렬 순서는 알파벳순(숫자 아님)이며 2 앞에 10이 붙습니다.


답변:

  1. 파일 내용을 정렬해야 합니까(정렬 또는 추가 bash 코드 사용)...

Globing은 파일 내용과는 아무 관련이 없으며 파일 이름만 관련됩니다. "파일 내용"을 정렬해야 한다면, 그렇습니다. 꽤 많은 코드를 사용해야
합니다 .sortbash

  1. ...또는 모든 환경에서 글로벌 확장이 항상 정렬되어 있습니까?

비활성화하지 않는 한 Globing 결과는 GLOB_NOSORT환경의 정렬 순서(변수)에 정의된 순서대로 정렬됩니다.LC_COLLATE

동일한 정렬 순서를 가지려면 동일한 유효한 데이터 정렬이 있어야 합니다. 둘 다 변수를 설정 LC_COLLATE하고 locale동일한 데이터 정렬 세부 정보를 포함하는 설명을 갖습니다.

  1. 조건부 연산자는 확장(또는 정렬)과 동일한 "정렬"을 사용합니까?

예. 둘 다 같은 방식으로 영향을 받습니다 LC_COLLATE.

  1. 확장하거나 정렬하면 file2.txt 다음에 file10.txt가 반환되지만(어떤 경우에?) 조건부 연산자 file10.txt를 사용하면 file2.txt보다 먼저 반환됩니까? 이 문제를 해결하려면 어떤 정렬 옵션을 사용해야 합니까?

10before의 결과 2는 "사전순"이며, 이는 bash 매뉴얼 설명에서 "알파벳순"이라고 부르는 것과 동일합니다. 따라서 bash(또는 POSIX 쉘)를 사용하여 정렬하는 경우 이는 모든 경우에 얻게 되는 순서입니다. 아무런 문제가 없으므로 수정할 수 없습니다(텍스트의 경우).

sort그러나 (셸 외부의 외부 도구)을 사용하기로 선택한 경우 numeric정렬(-n 옵션)을 요청하면 가 2입력 됩니다 10. 또는 텍스트에서 숫자를 추출하여 -lt -gt정수 비교를 수행하는 데 사용할 수 있습니다. 쉘(정수 산술 기호).

내 파일 이름 중 일부가 유니코드인 경우 고려해야 할 사항이 있나요?

최대:정렬 순서는 고정되어 있지 않습니다.

시간과 UNICODE 버전에 따라 변경됩니다.

익숙하지 않은 언어로 놀라운 결과를 얻을 수도 있습니다. 예를 들어:

"aa"는 덴마크어로 "å"와 일치합니다.

간단히 말해서 "놀라울 준비를 하세요"입니다.

특정 버전의 bash를 사용하는 데 문제가 있나요?

글쎄요, bash 2.0 이상의 버전을 사용해야 합니다

respect LC_COLLATE  2.0 

LC_COLLATE가 위 항목에 영향을 줍니까?

가변적인 LC_COLLATE영향모두위에서 언급한.

관련 정보