알겠습니다. 다음 정보를 얻었습니다.
check="${PATH//:/'\n'}"
위의 내용은 각 경로를 단순화된 방식으로 취하고 이를 변수로 멋지게 형식화합니다. 이제 각 행이 존재하는지 확인하고 echo와 결합하여 각 행을 선언하는지 어떻게 확인합니까(echo를 사용할 것 같습니다.)?
아마도 for 또는 while 루프가 관련되어 있다는 것을 알고 있지만 어떻게 해야 할지 모르겠습니다.
세게 때리다대답만 해주세요.
답변1
while read -d: dir
do
[ -d "$dir" ] || echo "Missing: $dir"
done <<<"${PATH%:}:"
read -d: dir
입력을 변수로 읽어 dir
해당 시점의 입력을 삭제합니다 :
.
[ -d "$dir" ]
디렉토리가 존재하는지 테스트
||
다음 문은 이전 문이 false를 반환하는 경우에만 실행됩니다.
<<<"${PATH%:}:"
다음을 사용하여 루프에 입력을 제공합니다.여기에 있는 문자열. 이 형식을 "${PATH%:}:"
사용하면 :
PATH 문자열을 따르게 됩니다. 이 작업은 두 단계로 수행됩니다. 처음 사용접미사 제거, , 는 ${PATH%:}
PATH 에서 후행( :
있는 경우) 을 제거합니다. 둘째, 콜론을 추가합니다.
답변2
이는 이 기사가 게시된 당시 존재했던 세 가지 답변 1 중 가장 좋은 부분을 결합하고 (해당 답변을 보려면 답변을 "가장 오래된"순으로 정렬) 약간 다른 접근 방식을 추가합니다.John1024는 무엇을 하고 있나요?:
IFS=: read -a path_components <<< "$PATH"
for dir in "${path_components[@]}"
do
printf "%s\t-> " "$dir"
if [ -d "$dir" ]
then
echo "Exists."
else
echo "Missing!!!!"
fi
done
IFS=:
본질적으로 John 과 동일한 작업을 수행합니다. (공백이나 탭이 아닌) read -d:
입력을 중단하므로 :
John의 답변과 마찬가지로 이름에 공백이 있는 디렉토리를 올바르게 처리합니다.
read -a path_components
입력 내용 읽기ㅏ배열;
"${path_components[@]"
배열 구성원 목록으로 확장됩니다. echo "$dir"
만약 $dir
에 참고하세요-
또는 .을 포함합니다 \
. (물론 .의 디렉터리 이름에는 이러한 이름이 없습니다. $PATH
) . printf "$dir"
가 포함되어 있으면 위험할 수 있습니다. ________ 1 이 답변을 쓰는 동안 그 중 하나가 제거되었습니다.$dir
%
답변3
다음 방법을 시도해 볼 수도 있습니다.
#!/bin/bash
arr=$(echo $PATH | tr ":" "\n")
for x in $arr
do
echo -n "$x"
if [ -d "$x" ];then
echo " -> Exists"
else
echo -e " -> \e[31mMissing!!!!\e[0m"
fi
done
arr=$(echo $PATH | tr ":" "\n")
디렉토리를 변수로 분할 하고 echo -e
디스플레이에 빨간색을 추가하여 주의를 환기시킵니다.
출력은 다음과 같습니다.
/usr/lib/qt-3.3/bin -> 존재함
/usr/local/sbin -> 존재함
/usr/local/bin -> 존재함
/sbin->존재합니다
/bin -> 존재함
/usr/sbin -> 존재함
/usr/bin -> 존재함
/root/bin -> 분실! ! !