
대화형 키보드 '읽기'에서 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/,/ /g
sed에게 모든 쉼표를 공백으로 바꾸라고 지시합니다. q
첫 번째 줄 이후에 종료하라고 알려줍니다.
고독은 <
나타냅니다리디렉션read
: 명령줄 다음에 오는 파일 같은 객체에서 명령 에 대한 입력을 얻도록 쉘에 지시합니다 .
구조물이 <(...)
호출됩니다.프로세스 대체괄호에 포함된 명령으로 파일류 객체를 생성합니다. 해당 명령은 sed
쉼표를 공백으로 바꾸는 명령입니다.
동일한 접근 방식이지만 awk와 함께 사용하는 경우:
read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')