2016-10-27 4 views
0
내가 bash는 해상도 체크를하고 있어요

를 실행하지만,이 루프는 한 번만 실행하고 오류없이 종료 :한 번만

for file in *; do \ 
    WIDTH = $(identify -ping -format '%h' $file) \ 
    HEIGHT = $(identify -ping -format '%w' $file) \ 
    if [ "$WIDTH" -ge 500 ]; then \ 
    echo width greater than 500 \ 
    elif ["HEIGHT" -ge 500]; then \ 
    echo height greater than 500 \ 
    fi \ 
done 

출력 :

height greater than 500 fi done 

되지 않는 이유는 무엇 모든 파일을 확인하지 않습니까? identify 실행

+0

가 있습니까? 생각하는 디렉토리에서 작업 중인지 확인 했습니까? –

+0

12000 개 이상의 파일이'ls -al'로 검사됩니다. – 3zzy

+2

백 슬래시는 실제로 여기에 잘못되었습니다. –

답변

1
#!/bin/bash 
# using bash, not sh, ensures that <(), (()), and other extensions are available. 

for file in *; do 
    IFS=: read -r width height < <(identify -ping -format '%w:%h\n' "$file") 
    if ((width >= 500)); then 
    printf '%s\n' "$file has width greater than 500" 
    elif ((height >= 500)); then 
    printf '%s\n' "$file has height greater than 500" 
    fi 
done 

  • 두 번 외부 명령을 호출의 성능에 미치는 영향을 두 배로 한 번만 실행하고 두 변수를 모두 한 번에 읽는 것이 좋습니다. identify 명령의 출력을 스트림으로 수집하는 데 사용되는 구문은 process substitution이며 read 명령은 BashFAQ #001 또는 the relevant bash-hackers wiki page으로 오히려 포괄적으로 논의됩니다.
  • 백 슬래시는 연속입니다.; 이 명령은 여러 줄에 걸쳐있는 간단한 명령 (이 명령과 같은 복합 명령이 아님)이있는 경우에 적합합니다. 이런 맥락에서, 그들은 단순히 잘못되었습니다.
  • [명령이고 명령 이름은 인수와 공백으로 구분해야합니다. ls -l을 실행하는 것처럼 ls-l이 아니라 [foo을 실행할 수 없습니다. 두 개의 분리 된 단어로 [ foo이어야합니다. (더 명확한 경우 test : if test "$width" -ge 500; then ...과 같은 동의어를 사용하는 것이 좋습니다.
  • 모든 대문자 변수 이름은 시스템 및 쉘의 의미가있는 이름에 대해 by POSIX-defined convention으로 지정되지만, 하나 이상의 소문자가있는 이름은 응용 프로그램 용도로 예약되어 있습니다. (관례는 환경 변수에 명시 적으로 적용되지만 쉘 변수는 동일한 네임 스페이스를 공유합니다. 환경 변수와 겹치는 이름으로 쉘 변수를 설정하면 쉘 변수를 덮어 씁니다).
  • echo보다는 printf을 사용하여 행동을 더 정의했다 : the POSIX specification for echo은 정의되지 않은 행동의 넓은 범위를 남겨두고, 리터럴 백 슬래시가 포함 된 파일 이름을 인쇄 할 경우, echo의 동작은 구현에 의존하므로 이식성이된다. 특히 링크 된 페이지의 APPLICATION USAGE 섹션을 참조하십시오.
  • (())을 사용하면 변수 이름을 $없이 사용할 수 있고 -ge이 아닌 >=과 같은 자연스러운 C 스타일 수학 구문을 사용할 수있는 수학 컨텍스트에 넣을 수 있습니다. POSIX sh는 비슷한 동작을하지만 대치 명령이므로 POSIX sh에서는 대체 결과를 테스트하기 위해 if [ "$((width >= 500 ? 1 : 0))" = 1 ]을 쓸 수 있습니다.
+0

을 통해 코드를 실행하십시오. 자세한 설명은 고맙습니다. TIL.:) – 3zzy

0

이 너무 빨리 질문이 멋진 도우미 사용하여 자신을 알아 냈 - shellcheck : 얼마나 많은 파일

for file in *; do 
    WIDTH=$(identify -ping -format '%h' "$file") 
    HEIGHT=$(identify -ping -format '%w' "$file") 
    if [ "$WIDTH" -ge 500 ]; then 
    echo width greater than 500 
    elif [ "$HEIGHT" -ge 500 ]; then 
    echo height greater than 500 
    fi 
done 
+1

BTW,'identify '를 두 번 실행하는 것은 다소 비효율적입니다. 하나의 호출에서 두 변수를 모두 읽을 수 있습니다. 시연을 위해 내 대답을 편집 할 것입니다. –