Bash 스크립트에서 작업 디렉토리 분할

Bash 스크립트에서 작업 디렉토리 분할

만약 내가한다면:

IFS="/" read -ra PARTS

경로를 수동으로 입력하면 예상대로 "PARTS" 배열이 생성되지만 다음과 같습니다.

IFS="/" read -ra PARTS <<< $(pwd)

단일 요소를 포함하는 배열을 만들고 슬래시를 공백으로 변환합니다.

현재 작업 디렉토리를 배열로 분할하는 방법은 무엇입니까?

답변1

명령을 인용하면 작동합니다.

IFS="/" read -ra PARTS <<< "$(pwd)"
for i in "${PARTS[@]}"
do
  printf '%s\n' "$i"
done

home
user1

답변2

질문이 이래서

현재 작업 디렉토리를 배열로 분할하는 방법은 무엇입니까?

("직장에 어떻게 가나요?" 대신)IFS="something" read -a arrayname <<< $(command)

saveIFS="$IFS"; IFS=/ PARTS=($(pwd)); IFS="$saveIFS"

네, 알아요. 나는 노력했다

IFS=/ PARTS=($(pwd))

그리고

전체 명령을... 또는 로 묶어도 여전히 IFS으로 설정되어 있습니다. 물론, 그것을 포함시키면... 메인 쉘에 설정되지 않게 됩니다./{;}eval()PARTS

IFS=/ declare PARTS=($(pwd))

더욱 실패했습니다.

첫 번째 코드 블록( saveIFS)은 IFS의 이전 값을 저장하고 이를 복원합니다(변경 후). 그러나 이전에 IFS가 설정되지 않은 경우 위 코드는 IFS를 빈 문자열(일반적으로 빈 문자열이라고 함)로 설정합니다. 사용자 환경에 이러한 상황이 존재하고 IFS를 설정 해제 상태로 되돌리려면 다음을 수행할 수 있습니다.

checkIFS="${IFS+1}"
saveIFS="$IFS"
IFS=/ PARTS=($(pwd))
if [ "$checkIFS" ]
then
    IFS="$saveIFS"
else
    unset IFS
fi

(또는 한 줄에 모두)

checkIFS="${IFS+1}"; saveIFS="$IFS"; IFS=/ PARTS=($(pwd)); if [ "$checkIFS" ]; then IFS="$saveIFS"; else unset IFS; fi

여기서 checkIFSIFS가 설정되지 않으면 1로 설정되고, IFS가 null로 설정되면놓다. 그런 다음 IFS를 이전(설정)/(설정 해제) 상태로 복원하고 이전 값(있는 경우)을 복원하는 명확한 테스트를 수행합니다.

물론 환경을 변경하지 않고 유지하는 데 관심이 있다면(변수 제외 PARTS) checkIFSsaveIFS.

관련 정보