developer tip

Bash의 배열로 명령 출력 읽기

optionbox 2020. 10. 23. 07:48
반응형

Bash의 배열로 명령 출력 읽기


스크립트의 명령 출력을 배열로 읽어야합니다. 예를 들면 다음과 같습니다.

ps aux | grep | grep | x 

다음과 같이 한 줄씩 출력을 제공합니다.

10
20
30

명령 출력의 값을 배열로 읽어야하며 배열의 크기가 3보다 작 으면 몇 가지 작업을 수행합니다.


다른 답변이 명령의 출력에 공백이 포함 된 경우 (오히려 자주 인) 중단 또는 같은 문자 glob에한다 *, ?, [...].

배열에서 명령의 출력을 얻으려면 기본적으로 두 가지 방법이 있습니다.

  1. Bash≥4를 사용 mapfile하면 가장 효율적입니다.

    mapfile -t my_array < <( my_command )
    
  2. 그렇지 않으면 출력을 읽는 루프 (느리지 만 안전함) :

    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

반응형