사용자로부터 입력을 읽고 이를 사용하여 필드로 나누는 스크립트를 작성 중입니다 awk
. 스크립트 끝에 해당 필드 중 하나를 사용하고 싶기 때문에 일부 변수에 저장하려고 시도했지만 헛된 것입니다.
가능한 해결책 중 하나는 입력을 저장하고 awk
마지막에 다시 사용하여 처리하는 것인데, 이미 처리된 정보를 일부 변수에 유지하는 방법이 있는지 궁금합니다.
예를 들어,
read -p "Enter args: "; echo -n $REPLY | awk '{ \*Do some stuff with fields*\; nth=$3}'
# More script
echo "Your 3rd argument was $nth"
하지만 위의 내용은 작동하지 않습니다. nth
끝에는 비어 있습니다(즉, awk
?에 대해 로컬이라는 의미).
티아
답변1
awk가 필요한 이유는 확실하지 않지만 플래그를 추가하여 -a
배열 read
을 얻을 수 있습니다. 당신이 말하는 필드/열이 공백으로 구분/분리되어 있다고 가정합니다.
read -rp "Enter args: " -a input
printf 'Your 3rd argument was %s\n' "${input[2]}"
- bash 배열은 인덱스 0부터 시작한다는 점만 기억하세요.
입력을 반복할 수 있습니다.
read -rp "Enter args: " -a input
for ((i=0; i<${#input[@]}; i++)); do
printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done
아니면 이렇게
read -rp "Enter args: " -a input
for i in "${!input[@]}"; do
printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done
그러나 awk를 사용하여 수행할 작업은 다음과 같습니다.
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $3}' <<< "$REPLY")
printf 'Your 3rd argument was %s\n' "$nth"
하나의 변수 이름에 두 번째 필드와 세 번째 필드를 저장합니다.
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")
printf 'The argument was %s\n' "$nth"
두 번째와 세 번째 필드를 다른 변수 이름으로 분할하려는 경우.
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")
printf 'Your 2nd argument was %s\nYour 3rd argument was %s\n' "${nth#* }" "${nth% *}"
- 및
"${nth#* }"
는"${nth% *}"
별도의 변수로 저장할 수 있습니다.
awk
다음을 사용하여 모든 필드를 인쇄 $0
하고 read
다음을 사용하여 첫 번째 답변으로 돌아오는 것에 대한 답변이 하나 더 있습니다.read -ra
read -rp "Enter args: "
read -ra fields < <(awk '{\*Do some stuff with fields*\;print $0}' < <(printf '%s' "$REPLY"))
모든 필드 인쇄
printf '%s\n' "${fields[@]}"
- 이 질문에 대한 나의 첫 번째 게시물/답변은 bash 배열 필드를 반복하는 방법과 인덱싱 방법을 보여줍니다.