만약 내가한다면:
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
여기서 checkIFS
IFS가 설정되지 않으면 1로 설정되고, IFS가 null로 설정되면예놓다. 그런 다음 IFS를 이전(설정)/(설정 해제) 상태로 복원하고 이전 값(있는 경우)을 복원하는 명확한 테스트를 수행합니다.
물론 환경을 변경하지 않고 유지하는 데 관심이 있다면(변수 제외 PARTS
) checkIFS
및 saveIFS
.