저는 사용자의 입력을 읽고 이를 사용하여 필드로 나누는 스크립트를 작성하고 있습니다 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 배열의 필드를 반복하는 방법과 인덱싱 방법을 보여주었습니다.