파일 이름을 인수(현재 디렉터리에 있어야 함)로 취하고 기본 디렉터리 트리에서 연결된 모든 경로 이름을 찾는 스크립트를 설계합니다. 이 목록은 본인에게 우편으로 발송되어야 합니다. 나는 이것을 시도했지만 스크립트가 정확히 무엇을 원하는지 모르겠습니다.
#!/bin/bash
echo. "enter file name"
read name
if [ $name == "a1.txt" ]; then
source a1.txt
fi
/* a1.txt file contents tree -l */
답변1
좋습니다. 각 부분으로 나누어 보겠습니다.
- 파일 이름을 매개변수로 전달
- 파일이 존재하는지(그리고 일반 파일인지) 확인하세요.
- 아래 파일에 대한 모든 (기호) 링크를 찾으십시오.
$HOME
- 이 파일 목록을 다음으로 메일로 보내세요.
$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
우리는 출력을 원하기 때문에진단 정보(이 경우 오류 메시지)표준 오류 스트림echo
with 의 출력을 리디렉션합니다 >&2
. 또한 문제가 발생했음을 나타내기 위해 0이 아닌 종료 상태로 스크립트를 종료합니다.
파일이 존재할 뿐만 아니라일반 파일, 즉 디렉토리나 장치 노드 등이 아닌 것으로 변경하십시오 -e
( -f
설명서 읽기 test
).
홈 디렉토리에서 모든 심볼릭 링크를 찾으려면 다음을 사용할 수 있습니다.
find "$HOME" -type l
또는 중 하나를 사용하여 이러한 파일을 보고 사용자가 사용하여 제공한 파일과 비교할 수 있습니다 bash
.ksh93
if [[ "$name" -ef "$link" ]]; then ... fi
여기서 $name
및 는 에서 반환된 심볼릭 링크의 이름 $1
입니다 . 이 연산자는 두 피연산자가 모두 동일한 파일을 참조하는 경우(모든 기호 링크가 해결된 후) true를 반환합니다.$link
find
-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
전체 문자열을 사용하려는 이메일 주소로 바꾸세요.