사용자가 두 개의 이름을 지정 것으로 예상된다고 가정하면 일종의 두 이름 사이에,이 스크립트는 작업을 수행 할 파일을 나열 할 :
#!/bin/bash
case $# in
(2) : OK;;
(*) echo "Usage: $0 from to" >&2; exit 1;;
esac
lo="$1"
hi="$2"
for file in *
do [[ "$file" < "$lo" ]] && continue
[[ "$file" > "$hi" ]] && break
echo "$file"
done
case
수표 사용은 두 가지를 한 것으로를 논쟁하고 그들이 도움이되지 않는다면 도움이되는 메시지로 보석을 풀 수 있습니다. 간단히 가정하면 $lo
은 $hi
보다 낮습니다. 하지 않을 경우이를 교환 할 수있을 것입니다 :
if [[ "$1" < "$2" ]]
then lo="$1"; hi="$2"
else lo="$2"; hi="$1"
fi
*
(글로브)를 사용하여 파일 이름에 공백 (등) 문제를 방지 할 수 있습니다. ls
의 출력을 구문 분석하면 파일 이름에 공백 (등)이 있기 때문에 오류가 발생하기 쉽습니다. 테스트에서는 [[
을 사용하므로 문자열의 사전 식 순서를 지정할 수 있습니다. 클래식 [
테스트 연산자는 -lt
표기법을 사용하여 정수 비교를 수행하며 문자열 비교를 위해 =
및 !=
만 지원합니다.
glob의 이름은 정렬 된 순서이므로 첫 번째 조건은 $lo
항목 앞에 오는 이름을 건너 뜁니다. $hi
이 너무 작 으면 다른 파일을 처리 할 필요가 없습니다 (따라서 중단). 그렇지 않으면 이름을 인쇄합니다.
루프는 매우 컴팩트하게 작성됩니다. if
, elif
및 else
으로 약간 작아 질 수 있습니다. 디렉토리 목록을 감안할 때
for file in *
do
if [[ "$file" < "$lo" ]]
then continue
elif [[ "$file" > "$hi" ]]
then break
else echo "$file"
fi
done
:
cmp.sh human_numbers.pl intapprox.pl lg.c lu makefile x
fibonacci.pl idsdb00216213.ec lg lg.out lu.c unget.c x.c
bash cmp.sh garbage rubbish
실행은 생산 :
내가 기대하는 것을 동의
human_numbers.pl
idsdb00216213.ec
intapprox.pl
lg
lg.c
lg.out
lu
lu.c
makefile
는 약간 loosely- 당신의 나의 해석을 부여 말로 된 질문. garbage
도 rubbish
도 디렉토리의 파일 이름이 아니지만 여전히 작동합니다.이 같은 (기본)
당신이 '입력 2까지 입력 1부터 시작'무엇을 의미합니까? 파일/폴더의 순서는 무엇입니까? –
여기서 무엇을 하려는지 확실하지 않습니다. '-le'을 사용했다면 2 개의 입력이 숫자라고 가정합니다. 그리고 m 번째 결과를'ls'의 n 번째 결과에 나열하고 싶습니까? – doubleDown
@doubleDown 예, 입력은 숫자입니다. 예를 들어 내 홈 디렉토리에 MyDocs로 시작하고 MyVideos를 2nd로, MyMusic을 8로 시작하는 폴더가 있습니다. 내가하고 싶은 일은 다음과 같습니다. 첫 번째 입력으로 2 초에 7 초 걸릴 것입니다. 이제 폴더 이름을 순서대로 인쇄하고 싶습니다. – October