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* 또는 거기에 뭔가...헤헤 유명한 마지막 말])