나는 메가바이트 단위의 정수를 허용하는 코드를 작성하고 있습니다. 내 의도는 내 컴퓨터의 사용자를 반복하여 홈 디렉토리 사용량이 해당 메가바이트를 초과하는 사용자의 이름을 다시 에코하는 것입니다. 그래서 내 전략은 숫자를 가져와 킬로바이트에서 메가바이트로 변환하고 내 컴퓨터에 있는 모든 사람의 홈 디렉토리를 반복하여 사용자 이름을 다시 에코하는 것입니다.
그래서 내 코드는 다음과 같습니다.
#!/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))
있으며 다음 오류로 이동하여 프로세스를 반복할 수 있습니다.