Bash의 배열로 명령 출력 읽기
스크립트의 명령 출력을 배열로 읽어야합니다. 예를 들면 다음과 같습니다.
ps aux | grep | grep | x
다음과 같이 한 줄씩 출력을 제공합니다.
10
20
30
명령 출력의 값을 배열로 읽어야하며 배열의 크기가 3보다 작 으면 몇 가지 작업을 수행합니다.
다른 답변이 명령의 출력에 공백이 포함 된 경우 (오히려 자주 인) 중단 또는 같은 문자 glob에한다 *
, ?
, [...]
.
배열에서 명령의 출력을 얻으려면 기본적으로 두 가지 방법이 있습니다.
Bash≥4를 사용
mapfile
하면 가장 효율적입니다.mapfile -t my_array < <( my_command )
그렇지 않으면 출력을 읽는 루프 (느리지 만 안전함) :
my_array=() while IFS= read -r line; do my_array+=( "$line" ) done < <( my_command )
다음과 같은 내용을 많이 볼 수 있습니다.
my_array=( $( my_command) )
그러나 그것을 사용하지 마십시오! 어떻게 깨 졌는지보세요 :
$ # this is the command used to test:
$ echo "one two"; echo "three four"
one two
three four
$ my_array=( $( echo "one two"; echo "three four" ) )
$ declare -p my_array
declare -a my_array='([0]="one" [1]="two" [2]="three" [3]="four")'
$ # Not good! now look:
$ mapfile -t my_array < <(echo "one two"; echo "three four")
$ declare -p my_array
declare -a my_array='([0]="one two" [1]="three four")'
$ # Good!
그런 다음 일부 사람들은 IFS=$'\n'
이것을 수정하기 위해 사용 하는 것이 좋습니다 .
$ IFS=$'\n'
$ my_array=( $(echo "one two"; echo "three four") )
$ declare -p my_array
declare -a my_array='([0]="one two" [1]="three four")'
$ # It works!
하지만 이제 다른 명령을 사용하겠습니다.
$ echo "* one two"; echo "[three four]"
* one two
[three four]
$ IFS=$'\n'
$ my_array=( $(echo "* one two"; echo "[three four]") )
$ declare -p my_array
declare -a my_array='([0]="* one two" [1]="t")'
$ # What?
그의 나는라는 파일이 있기 때문에 t
현재 디렉토리를 ... 그리고이 파일 이름은 일치되는 글로브 [three four]
어떤 사람들이 사용하는 것이 좋습니다 것이이 시점에서 ... set -f
비활성화 대체 (globbing)로 :하지만 봐 : 당신은 변화가 IFS
사용 set -f
를 해결 할 수 있도록 깨진 기술 (그리고 당신은 그것을 실제로 고치지도 않습니다)! 할 때 우리가 정말하고 있다는 싸우는 하지, 쉘 쉘 작업 .
$ mapfile -t my_array < <( echo "* one two"; echo "[three four]")
$ declare -p my_array
declare -a my_array='([0]="* one two" [1]="[three four]")'
여기서 우리는 쉘로 작업하고 있습니다!
당신이 사용할 수있는
my_array=( $(<command>) )
명령의 출력을 <command>
배열 에 저장합니다 my_array
.
다음을 사용하여 해당 배열의 길이에 액세스 할 수 있습니다.
my_array_length=${#my_array[@]}
이제 길이가에 저장됩니다 my_array_length
.
Imagine that you are going to put the files and directory names (under the current folder) to an array and count its items. The script would be like;
my_array=( `ls` )
my_array_length=${#my_array[@]}
echo $my_array_length
Or, you can iterate over this array by adding the following script:
for element in "${my_array[@]}"
do
echo "${element}"
done
참고URL : https://stackoverflow.com/questions/11426529/reading-output-of-a-command-into-an-array-in-bash
'developer tip' 카테고리의 다른 글
리디렉션을 일으키지 않고 URL에 조각을 추가 하시겠습니까? (0) | 2020.10.23 |
---|---|
if-else 또는 다른 비교 연산자를 사용하지 않고 최대 두 개의 정수를 찾는이 스 니펫을 설명 하시겠습니까? (0) | 2020.10.23 |
버전 번호 구문 분석을위한 정규식 (0) | 2020.10.23 |
Scala 2.8 컬렉션 디자인 튜토리얼 (0) | 2020.10.23 |
Python 모듈의 절대적 vs. 명시 적 상대적 가져 오기 (0) | 2020.10.23 |