회색 껍질로 문자열을 분할하시겠습니까? (바쁨 상자)

회색 껍질로 문자열을 분할하시겠습니까? (바쁨 상자)

BusyBox에서 제공하는 도구만을 사용하여 Ash Shell에서 문자열을 분할하려고 합니다.

문자열의 형식은 이지만 host-name:port,host-name2:port2첫 번째 호스트 이름과 포트에만 관심이 있으므로 변수로 액세스하고 싶습니다.

여기에서 찾은 옵션 중 일부를 시도했지만 대부분은 bash와 관련이 있으며 동등한 명령/함수는 ash 쉘에 존재하지 않는 것 같습니다.

어떤 아이디어가 있나요?

답변1

많은 부작용과 제한 사항이 있는 IFS 솔루션 외에도 공백, 줄 바꿈, 빈 필드 및 다중 문자 제수를 올바르게 처리하는 쉘에 구애받지 않는(많은 쉘의 경우) 솔루션은 다음과 같습니다.

#!/bin/sh

in='One-XX-X-17.0.0'

a=$in; div='-'; set --
while
    b=${a#*"$div"}
    set -- "$@" "${a%%"$div"*}"
    [ "$a" != "$b" ]
do
    a=$b
done
printf 'Element: %s\n' "$@"

#split 17.0.0 into NUM
a=$4; div='.'; set --
while
    b=${a#*"$div"}
    set -- "$@" "${a%%"$div"*}"
    [ "$a" != "$b" ]
do
    a=$b
done
printf 'Num: %s\n' "$@"

다음을 인쇄합니다:

$ ./script
Element: One
Element: XX
Element: X
Element: 17.0.0
Num: 17
Num: 0
Num: 0

답변2

이 솔루션에서도 비슷한 문제가 있었습니다(-> 전체 문자열을 토큰으로 분할).

#!/bin/sh
input='host-name:port,host-name2:port2,One,XX X,192.178.88:999,17.0.0'
echo "input: $input"

OLDIFS=$IFS;IFS=,
for token in $input; do
    hostname=$(echo ${token%:*})
    port=$(echo ${token#*:})
    echo "hostname: $hostname, port: $port"
done
IFS=$OLDIFS

결과 :

$ busybox ash bla.sh
input: host-name:port,host-name2:port2,One,XX X,192.178.88:999,17.0.0
hostname: host-name, port: port
hostname: host-name2, port: port2
hostname: One, port: One
hostname: XX X, port: XX X
hostname: 192.178.88, port: 999
hostname: 17.0.0, port: 17.0.0

더 자세한 내용을 보려면 Ash의 매뉴얼 페이지(1)(https://linux.die.net/man/1/ash) "IFS" 및 "매개변수 확장"을 검색합니다.

참고: 입력을 신뢰하는 경우에만 이 작업을 수행하십시오! 파일 글로빙 및 잘못될 수 있는 기타 사항에 대한 아래 설명을 참조하세요. 입력이 어느 정도 통제되고 있는 경우 이는 깔끔한 솔루션입니다. (->스크립트에 대한 입력이 변경된 후 즉시 테스트되어 잘못된 구성이 즉시 발견될 것이라는 것을 알고 있는 스크립트에 이것을 사용하고 있습니다. [또한아무도~ 할 것이다한 번Do* 또는 거기에 뭔가...헤헤 유명한 마지막 말])

관련 정보