디스크 사용량을 확인하고 이를 Bash에 인쇄된 정보와 비교하는 방법

디스크 사용량을 확인하고 이를 Bash에 인쇄된 정보와 비교하는 방법

나는 메가바이트 단위의 정수를 허용하는 코드를 작성하고 있습니다. 내 의도는 내 컴퓨터의 사용자를 반복하여 홈 디렉토리 사용량이 해당 메가바이트를 초과하는 사용자의 이름을 다시 에코하는 것입니다. 그래서 내 전략은 숫자를 가져와 킬로바이트에서 메가바이트로 변환하고 내 컴퓨터에 있는 모든 사람의 홈 디렉토리를 반복하여 사용자 이름을 다시 에코하는 것입니다.

그래서 내 코드는 다음과 같습니다.

#!/bin/bash
#https://unix.stackexchange.com/questions/199220/how-to-loop-over-users

size=$(($1 * 1000000))
getent passwd | while IFS=: read -r name password uid gid gecos home shell; do
  du -sh $home | awk '{$1}'
  if [ $i -ge  size]
  then
    echo $name
  fi
done

루프는 사용자를 순회하며 격리되어 실행됩니다. awk의 목적은 디스크 사용량에 대한 숫자만 캡처하는 것입니다. 이 또한 모든 디렉터리를 순회하는 것처럼 보이지만 그렇게 할 수 있는 권한이 없습니다.

du: cannot read directory '/etc/vpnc': Permission denied
du: cannot read directory '/etc/credstore': Permission denied
du: cannot read directory '/etc/ssl/private': Permission denied

또한 이것을 디스크 사용량 제한과 비교하려고 하면 다음과 같습니다.

if [ $i -ge  size]

awk가 크기를 올바르게 캡처하지 않기 때문에 이 줄을 찾을 수 없다고 합니다. 그렇다면 입력을 home direct 또는 du 크기와 어떻게 비교합니까?

7: [: missing ]

감사해요

답변1

작동하지 않는 것을 발견하기 위해 스크립트를 작성하는 것은 일반적입니다. 여기서 누락된 것은 기본적인 문제 해결입니다. 문제는 이것이다:

  • 스크립트의 알 수 없는 부분이 손상되었습니다.
  • 스크립트를 복구하려고 시도했지만 손상된 부분을 찾을 수 없습니다.

필요한 전략은 2단계 프로세스입니다.

  • 오류를 재현하는 데 필요한 가장 간단한 코드 조각을 찾으십시오.
  • 오류를 해결하려면 코드를 수정하세요.

첫 번째 오류 메시지를 살펴보겠습니다.

4: 20: not found

이는 4:4행을 의미하므로 해당 행을 확인하고 싶습니다. size=$($1 * 1000000) 여기서는 구문을 사용하고 있으므로 인수를 $1사용하여 호출할 수 있도록 코드를 bash 함수에 넣으려고 합니다(따라서 동일한 $1구문을 사용합니다:

bash-3.2$ function test_code { size=$($1 * 1000000); }
bash-3.2$ test_code 20
bash: 20: command not found

충분히 가깝습니다(다른 버전의 bash를 사용하고 있을 수도 있음).오류 재현이제 시도해 볼 수 있습니다.이 코드를 수정하세요. 여기서는 약간의 경험이 도움이 됩니다. 20:이는 다시 줄 번호로 해석될 수 있기 때문입니다. 그러나 실제로는 매개변수의 값일 뿐입니다.

bash-3.2$ test_code example
bash: example: command not found

date여기서의 문제는 다음과 같이 기존 명령의 이름을 지정하는 경우 더욱 분명해집니다.

bash-3.2$ test_code date
date: illegal time format
usage: date [-jnRu] [-I[date|hours|minutes|seconds]] [-f input_fmt]
            [-r filename|seconds] [-v[+|-]val[y|m|w|d|H|M|S]]
            [[[[mm]dd]HH]MM[[cc]yy][.SS] | new_date] [+output_fmt]

귀하의 코드는 인수를 곱하려고 시도하지 않고 1000000인수를 명령 이름으로 처리하고 해당 명령을 실행하려고 시도합니다.

  • 코드에서 두 값을 곱하고 결과를 저장하려고 합니다.
  • 대신 코드는 주어진 값을 명령으로 실행합니다.

따라서 Google에서 "bash에서 두 값을 곱"해야 합니다. Google은 나에게 다음과 같은 Unix 및 Linux 질문을 주었습니다.Bash 스크립트의 산술

우리는 봤다:

기호를 사용하여 이를 수행 할 수 있습니다 $((expr)).

$ echo $((6 + 6))
12
$ echo $((6 * 6))
36

이것을 우리 코드와 비교하면 문제가 분명해집니다.

bash-3.2$ function test_code { echo $($1 * 1000000); }
bash-3.2$ test_code 20
bash: 20: command not found

즉, 괄호 echo $($1 * 1000000)는 한 쌍만 ()사용되는 반면, 예제 echo $((6 * 6))코드에서는 두 쌍을 사용합니다. 이 코드를 수정할 수 있는지 살펴보겠습니다.

bash-3.2$ function test_code { echo $(($1 * 1000000)); }
bash-3.2$ test_code 20
20000000

이제 스크립트의 4번째 줄을 업데이트할 수 size=$(($1 * 1000000))있으며 다음 오류로 이동하여 프로세스를 반복할 수 있습니다.

관련 정보