쉘 스크립트에 관한 질문입니다. 이 질문을 받을 수 없습니다.

쉘 스크립트에 관한 질문입니다. 이 질문을 받을 수 없습니다.

파일 이름을 인수(현재 디렉터리에 있어야 함)로 취하고 기본 디렉터리 트리에서 연결된 모든 경로 이름을 찾는 스크립트를 설계합니다. 이 목록은 본인에게 우편으로 발송되어야 합니다. 나는 이것을 시도했지만 스크립트가 정확히 무엇을 원하는지 모르겠습니다.

#!/bin/bash
echo. "enter file name"
read name
if [ $name == "a1.txt" ]; then
source a1.txt
fi 
/* a1.txt file contents tree -l */

답변1

좋습니다. 각 부분으로 나누어 보겠습니다.

  1. 파일 이름을 매개변수로 전달
  2. 파일이 존재하는지(그리고 일반 파일인지) 확인하세요.
  3. 아래 파일에 대한 모든 (기호) 링크를 찾으십시오.$HOME
  4. 이 파일 목록을 다음으로 메일로 보내세요.$LOGUSER

스크립트는 하나 이상의 매개변수를 사용할 수 있습니다. 명령줄 매개변수는 다음에서 찾을 수 있습니다.위치 매개변수 $1기다리다. 우리는 하나의 매개변수만 얻을 것이기 때문에 $2의 내용에만 관심을 갖습니다 $1.

name="$1"

이름이 존재하는지 테스트하려면 다음을 사용할 수 있습니다.

if [ -e "$name" ]; then ... fi

이 경우 우리는 이름이 있는지 테스트하는 데 관심이 있습니다.아니요존재하다:

if [ ! -e "$name" ]; then
   echo 'Name does not exist in directory' >&2
   exit 1
fi

우리는 출력을 원하기 때문에진단 정보(이 경우 오류 메시지)표준 오류 스트림echowith 의 출력을 리디렉션합니다 >&2. 또한 문제가 발생했음을 나타내기 위해 0이 아닌 종료 상태로 스크립트를 종료합니다.

파일이 존재할 뿐만 아니라일반 파일, 즉 디렉토리나 장치 노드 등이 아닌 것으로 변경하십시오 -e( -f설명서 읽기 test).

홈 디렉토리에서 모든 심볼릭 링크를 찾으려면 다음을 사용할 수 있습니다.

find "$HOME" -type l

또는 중 하나를 사용하여 이러한 파일을 보고 사용자가 사용하여 제공한 파일과 비교할 수 있습니다 bash.ksh93

if [[ "$name" -ef "$link" ]]; then ... fi

여기서 $name및 는 에서 반환된 심볼릭 링크의 이름 $1입니다 . 이 연산자는 두 피연산자가 모두 동일한 파일을 참조하는 경우(모든 기호 링크가 해결된 후) true를 반환합니다.$linkfind-ef

이는 find위의 테스트와 다음과 같이 결합될 수 있습니다.

find "$HOME" -type l |
while read -r link; do
    if [[ "$name" -ef "$link" ]]; then
        printf '%s\n' "$link"
    fi
done

이메일을 보내려면 이 mail명령을 사용하세요. 이는 이전 파이프의 끝에 표시될 수 있습니다.

find "$HOME" -type l |
while read -r link; do
    if [[ "$name" -ef "$link" ]]; then
        printf '%s\n' "$link"
    fi
done |
mail -s "These are the links" "$LOGUSER@localhost"

$LOGUSER귀하의 사용자 이름은 유지됩니다. "$(id -un)"어떤 이유로 인해 올바르게 설정되지 않은 경우 를 사용하거나 $LOGUSER전체 문자열을 사용하려는 이메일 주소로 바꾸세요.

관련 정보