로그 파일을 인수로 받아들이고 파일 이름이 전달되었지만 파일이 존재하지 않는 경우 함수를 호출합니다.

로그 파일을 인수로 받아들이고 파일 이름이 전달되었지만 파일이 존재하지 않는 경우 함수를 호출합니다.

나는 현재 질문의 주장과 매개 변수에 대해 약간 혼란스러워합니다.

현재는 로그 파일 이름을 매개변수(예: )로 허용해야 하지만, 매개변수가 지정되지 않으면 /var/log/secure-<yyyymmdd>기본값은 입니다./var/log/secure

로그 파일 이름을 매개변수로 받아들이는 방법은 무엇입니까? 질문의 표현일지도 모르지만 그것이 무엇을 의미하는지 잘 이해하지 못합니다.

다음은 이 질문 이전에 제가 수행한 현재 코드의 일부입니다.

#!/bin/bash
grep " su: " /var/log/secure | while read -r abc; do   
echo "$abc"
done

두 번째 부분에서는 코드 2(현재 작업 중)로 종료되는 함수를 만든 다음 파일 이름이 전달되고 파일이 존재하지 않는 경우 해당 함수를 호출해야 합니다. 내가 그런 짓을 하겠는가? 잘못된 것 같았지만 무엇이 잘못되었는지는 알 수 없었습니다.

IF [ -d /var/log/secure ]
then

else
runfunction

답변1

변수를 첫 번째 명령줄 인수로 설정하려면 다음을 수행하십시오.

pathname=$1

매개변수를 사용할 수 없거나 비어 있는 경우 기본값으로 설정하려면 다음을 사용하세요.

pathname=${1:-/var/log/secure}

일반적인 형태는 입니다 ${parameter:-word}.표준 POSIX 매개변수 확장, 쉘 매뉴얼에도 문서화되어 있습니다.

-d테스트는 주어진 문자열이 기존 디렉터리 경로에 해당하는지(또는 기존 디렉터리 경로에 대한 심볼릭 링크인지) 테스트합니다. 테스트 -f는 일반 파일에 대해 동일한 방식으로 작동하며 -e모든 항목을 다룹니다(이름이 무엇이든 관계없이 이름이 존재하면 참).

테스트의 중요성을 무효화하려면 를 사용하면 됩니다 !.

if [ ! -f "$pathname" ]; then
    myfunction
fi

또는 단락 구문을 사용하여

[ ! -f "$pathname" ] && myfunction

myfunction이 함수는 변수의 문자열이 pathname기존 일반 파일(또는 이에 대한 링크)을 지정하지 않는 경우 호출됩니다.


기본값으로 명령줄 인수(경로)를 사용하고 지정된 경로가 기존 일반 파일과 일치하지 않는 경우 종료 상태 2로 종료되는 완전한 스크립트입니다.

#!/bin/bash

pathname=${1:-/var/log/secure}

if [ ! -f "$pathname" ]; then
    printf 'There is no file called "%s"\n' "$pathname"
    exit 2
fi

printf 'The file "%s" exists\n' "$pathname"

관련 정보