간단한 스크립트로 생성된 0바이트 파일

간단한 스크립트로 생성된 0바이트 파일

다음과 같은 스크립트가 있습니다.

#!/bin/bash
df -k | tr -s " " "," | awk 'BEGIN {FS=","} {print $1,$5}'|sed 1d > file1.txt
while read partition percentUsed
do
if [ $percentUsed > 75 ]
then
echo Partition: ${partition} space is ${percentUsed}
else
echo Pration: $partition: OK!!
fi
done < file1.txt

스크립트가 올바르게 실행되고 있지만 75라는 0바이트 파일이 생성됩니다. 왜 이런 일이 일어나는지 아십니까?

$ sh diskUsed.sh
Partition: C:/Users/Public/Documents/CYGWIN/bin space is 75%
Partition: C:/Users/Public/Documents/CYGWIN/lib space is 75%
Partition: C:/Users/Public/Documents/CYGWIN space is 75%
Partition: C: space is 75%
Partition: H: space is 91%


$ ls -lrt
total 2
-rwxrwxrwx 1 diwvibh Domain Users 284 Nov 21 04:17 diskUsed.sh
-rw-r--r-- 1 diwvibh Domain Users 133 Nov 21 04:29 file1.txt
-rw-r--r-- 1 diwvibh Domain Users   0 Nov 21 04:29 75

답변1

 if [ $percentUsed > 75 ]

당신은 사용해야합니다-gt숫자 비교를 위한 연산자입니다. 현재 수행 중인 작업은 명령의 (빈) 출력을 저장하는 것입니다.[ $%사용됨 ]"를 "75"라는 파일로 저장합니다.

스크립트가 올바르게 실행되고 있지만 75라는 0바이트 파일이 생성됩니다. 왜 이런 일이 일어나는지 아십니까?

올바르게 실행되지 않습니다. 이것"[ $%사용됨 ]" 문자열이 비어 있지 않으면 이 명령은 true를 반환합니다. 이는 항상 이 스크립트의 경우이므로언제나if 문의 첫 번째 분기를 가져옵니다.

왜냐하면$% 사용됨정수가 아닙니다(후행 '%'가 있음). 사용할 수 있습니다.${퍼센트사용%[%]}@val0x00ff가 제안한 대로 변수에서 후행 "%"를 제거하거나 awk에 0을 추가하십시오.

Bash 스크립트에 대한 일반 참고 사항:

  1. 동의하다[[표현]] 대신에 [표현] 더 강력하고 빈 문자열을 더 잘 처리하기 때문입니다.
  2. 특별한 이유가 없는 한 문자열 주위에 큰따옴표를 사용하십시오(예: 개행 문자 제거).
  3. 중괄호 추가: $var 대신 ${var} - 읽을 때 혼란을 없애고 변수가 텍스트에 인접하도록 허용합니다. 예:echo "남은 금액: ${kb}KB"
  4. 일반적으로 가능하면 임시 파일을 생성하지 마십시오. 대신 단계 사이에 파이프를 사용하십시오.
  5. 다음과 같은 도구를 사용하는 경우) 그런 다음 이 기능을 사용하여 코드를 더 깔끔하게 만들고 다른 사람의 코드를 더 쉽게 읽을 수 있게 만드는 방법을 알아보세요.
  6. 코드를 올바르게 들여쓰기하세요(실생활에서는 할 수 있지만 게시물에서는 할 수 없을 수도 있습니다).
  7. 느낌표("!")를 입력하려면 다음을 사용하세요.세트+H그래서 그들은 당신을 망치지 않을 것입니다인터렉티브Bash를 통해 기록을 삽입합니다.

다음은 스크립트의 작업 버전입니다.

#!/bin/bash +H
df -k | awk '(FNR>1){print $1,$5+0}' | while read partition percentUsed
do
    if [[ $percentUsed -gt 75 ]]
    then
        echo "Partition: ${partition} space is ${percentUsed}% used"
    else
        echo "Partition: ${partition}: OK!!"
    fi
done

Nit pick: 80%를 사용하면 "echo" 줄에 "Partition /home space is 80"이 출력되고, 많은 사람들이 "space"를 ""로 읽습니다.무료공간', 즉 20%입니다.

답변2

5행에서는 $percentUsed의 내용이 "75" 파일에 기록됩니다. 대신, if [ ``echo $percentUsed | sed 's/%//'`` -gt 75 ]어느 쪽이 원하는 것을 해야 하는지 시도해 보세요. 적어도 Linux의 bash 4.2.25에서는 작동합니다. 참고: 여기에 표시된 두 개의 백틱이 아닌 하나의 백틱만 사용하십시오. 이는 Stackexchange 웹 플랫폼이 이러한 백틱을 해석하기 때문입니다.

답변3

이는 디스크 공간을 계산하는 효율적인 방법입니다. 이 예에서는 dir을 사용하고 있습니다 /home.

#!/bin/bash

 { read -r; read -rd '' -a disk_usage; } < <(LC_ALL=C df -Pk "/home"; printf \\0)
    percent=$(echo "${disk_usage[4]}" | awk '{print $0+0}')
    if (( percent > 75 )); then echo "Disk is critical"; else echo "Disk space is OK"; fi

참고로, 귀하의 명령은 다음과 같습니다

df -k | tr -s " " "," | awk 'BEGIN {FS=","} {print $1,$5}'|sed 1d

tr, awk, 등 많은 프로세스를 분기하기 때문에 매우 비효율적입니다 sed. 한 번에 이 작업을 수행할 수 있습니다. +0로고를 보려면 끝에 있는 로고를 제거하세요 %.

df -k | awk 'NR>1{print $1,$(NF-1)+0}'

관련 정보