쉘 명령줄 입력줄쉼표를 공백으로 변경

쉘 명령줄 입력줄쉼표를 공백으로 변경

대화형 키보드 '읽기'에서 4개의 변수를 사용하는 간단한 스크립트가 있지만 명령에 쉼표가 있습니다. IFS 구분 기호 값을 읽었지만 예제에서는 키보드 입력이 아닌 파일에서만 읽는 것을 보여줍니다. 입력을 변경하는 데 트릭이 있습니까? 아니면 스크립트가 읽을 수 있는 올바른 형식이 되도록 SED/AWK를 통해 명령을 파이프해야 합니까?

스크립트는 화려하지 않고 텍스트만 입력하면 입력 값을 추가하고 입력된 텍스트로 실행할 수 있는 명령 문자열을 다시 반향합니다.

[네트워크] [카드],[포트] [호스트 이름] 0123 0123,A1 ABCDEFG

#!/bin/bash
echo "Enter network info:"
read VAR1 VAR2 VAR3 VAR4
#I have no clue what Im doing

echo -e "${green}ping test and ssh into $VAR4${NC}"

답변1

쉼표를 단어 구분 기호로 처리하려면 다음을 시도해 보십시오.

IFS="$IFS," read a b c d

IFS이는 쉘이 필드 구분 기호로 사용하는 문자 목록인 에 일시적으로 쉼표를 추가합니다 .

예를 들어, 몇 가지 입력을 수집해 보겠습니다.

$ IFS="$IFS," read a b c d
1, 2,3 , 4

bash가 해당 입력을 어떻게 해석했는지 살펴보겠습니다.

$ echo "a=$a b=$b c=$c d=$d"
a=1 b=2 c=3 d=4

개선

프롬프트와 읽기 명령을 결합할 수 있습니다:

IFS="$IFS," read -p "Enter network info: " a b c d

선적 서류 비치

에서 man bash:

IFS
확장 후 단어 분할과 read 내장 명령을 사용하여 줄을 단어로 분할하는 데 사용되는 내부 필드 구분 기호입니다. 기본값은 다음과 같습니다. <space><tab><newline>

대안

불특정 이유로 sed이 작업에 정말로 사용하고 싶은 경우:

read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')

이 명령은 s/,/ /gsed에게 모든 쉼표를 공백으로 바꾸라고 지시합니다. q첫 번째 줄 이후에 종료하라고 알려줍니다.

고독은 <나타냅니다리디렉션read: 명령줄 다음에 오는 파일 같은 객체에서 명령 에 대한 입력을 얻도록 쉘에 지시합니다 .

구조물이 <(...)호출됩니다.프로세스 대체괄호에 포함된 명령으로 파일류 객체를 생성합니다. 해당 명령은 sed쉼표를 공백으로 바꾸는 명령입니다.

동일한 접근 방식이지만 awk와 함께 사용하는 경우:

read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')

관련 정보