내가 해결하려는 문제
내가 해결하려는 문제는 두 개의 bash 배열과 단일 요소의 요소를 반복하여 요소가 이전에 그 자리에서 선언된 변수로 저장되지 않도록 하는 것입니다.
for e in "$(seq -f "number-%g" 0 4) $(seq -f "number-%g" 5 9) number-10" ; do echo $e; done
이 작업을 수행하면 다음이 표시됩니다.
$ for e in "$(seq -f "number-%g" 0 4) $(seq -f "number-%g" 5 9) number-10" ; do echo $e; done
number-0 number-1 number-2 number-3 number-4 number-5 number-6 number-7 number-8 number-9 number-10
모든 것이 같은 줄에 인쇄되는 것 같습니다.
내가 확인한 리소스
나는 다음 페이지의 리소스를 읽고 사용해 보았습니다.
- https://www.thegeekstuff.com/2010/06/bash-array-tutorial/(특히 "13. 두 Bash 배열 연결" 섹션)
- https://linuxhint.com/bash_range/
내가 시도한 실험
실험 1
그러면 배열이 중간 변수에 저장됩니다.
seq1="$(seq -f "number-%g" 0 4)"
seq2="$(seq -f "number-%g" 5 9)"
elem="number-10"
all=("${seq1[@]}" "${seq2[@]}" "${elem}")
인쇄된 결과는 다음과 같습니다.
$ for e in $all; do echo $e; done
number-0
number-1
number-2
number-3
number-4
두 번째 배열이나 마지막 요소를 선택하지 않는 것 같습니다.
실험 2
여기서는 배열을 사용하여 생성하는 대신 두 개의 배열을 명시적으로 저장합니다 .seq
seq
$ seq1=("number-0" "number-1" "number-2" "number-3" "number-4")
$ seq2=("number-5" "number-6" "number-7" "number-8" "number-9")
$ all=("${seq1[@]}" "${seq2[@]}" "number-10")
이것을 "number-10"과 함께 인쇄하면 다음이 생성됩니다.
$ for e in "${all[@]}"; do echo $e; done
number-0
number-1
number-2
number-3
number-4
number-5
number-6
number-7
number-8
number-9
number-10
bash 팁을 듣고 싶습니다! 감사해요!
답변1
이제 이것에 대해 이야기해 봅시다:
$ seq1="$(seq -f "number-%g" 0 4)"
$ seq2="$(seq -f "number-%g" 5 9)"
$ elem="number-10"
$ all=("${seq1[@]}" "${seq2[@]}" "${elem}")
$ declare -p all
declare -a all=([0]=$'number-0\nnumber-1\nnumber-2\nnumber-3\nnumber-4' [1]=$'number-5\nnumber-6\nnumber-7\nnumber-8\nnumber-9' [2]="number-10")
$ for e in $all; do echo $e; done
number-0
number-1
number-2
number-3
number-4
참고 declare -p
- 변수의 내용을 확인하는데 매우 편리합니다.
all
는대량으로바꾸다. 역참조하면 $all
실제로 수행하는 작업 ${all[0]}
, 즉 검색만 수행하는 작업입니다.첫 번째요소.
이 all
배열에는 요소가 3개만 있습니다. 그리고 seq1
변수 seq2
는배열이 아님, 이는 일반적인 "스칼라" 변수입니다. 이전 단락과 유사하게 배열 요소 구문을 사용하여 스칼라 변수를 참조할 수 있습니다.
$ x="hello world"
$ declare -p x
declare -- x="hello world"
$ echo "$x"
hello world
$ echo "${x[0]}"
hello world
$ echo "${x[1]}"
$ echo "${x[*]}"
hello world
$ echo "${x[@]}"
hello world
외부 명령을 실행하여 캡쳐하고 싶은 경우출력 라인 수, mapfile
명령을 사용하십시오. 당신은 또한 사용해야합니다프로세스 교체외부 명령을 호출합니다.
$ unset seq1 seq2 all
$ mapfile -t seq1 < <(seq -f "number-%g" 0 4)
$ mapfile -t seq2 < <(seq -f "number-%g" 5 9)
$ all=("${seq1[@]}" "${seq2[@]}" "${elem}")
$ declare -p all
declare -a all=([0]="number-0" [1]="number-1" [2]="number-2" [3]="number-3" [4]="number-4" [5]="number-5" [6]="number-6" [7]="number-7" [8]="number-8" [9]="number-9" [10]="number-10")
$ printf "%s\n" "${all[@]}"
number-0
number-1
number-2
number-3
number-4
number-5
number-6
number-7
number-8
number-9
number-10
외부 도구를 사용하지 않고 bash에서 이 시퀀스를 생성하려면 다음을 사용하십시오.지원 확장:
$ all=( "number-"{0..10} )
$ declare -p all
declare -a all=([0]="number-0" [1]="number-1" [2]="number-2" [3]="number-3" [4]="number-4" [5]="number-5" [6]="number-6" [7]="number-7" [8]="number-8" [9]="number-9" [10]="number-10")