Bash 스크립트를 사용하여 함수 만들기

Bash 스크립트를 사용하여 함수 만들기

저는 아래 코드를 개발했으며 향후 요구 사항에 맞게 이 코드를 개선하고 싶습니다. 그래서 함수를 사용하면 코드가 지금보다 훨씬 좋아지고 매우 체계적으로 보일 것이라고 생각했습니다.

그렇다면 절차나 조직화된 코드 블록으로 어떻게 이동합니까?

저 좀 도와 주 시겠어요?

버전:Red Hat Enterprise Linux 서버 버전 7.3(Maipo)

(출력은 동일해야 함)

 #!/bin/bash

 hammer host list >| host.list
 cat host.list | grep "RHEL Server" | awk -F'|' '{ print $3}' |  sort > 
 host.modified1
 grp=`sort host.modified1 | uniq -c`
 echo "Linux Versions Grouped by Count" > host.modified1
 echo "" >> host.modified1
 echo "$grp"  >> host.modified1
 echo "" >> host.modified1
 echo "Linux Versions and Hostnames" >> host.modified1
 echo "" >> host.modified1
 cat host.list | grep "RHEL Server" | awk -F'|' '{ print $3"|"$2  }' | sort 
 >> host.modified1

산출;

  Linux Versions Grouped by Count

  8  RHEL Server 6.5  
 21  RHEL Server 6.6  
  1  RHEL Server 6.7  
 10  RHEL Server 6.8  
 39  RHEL Server 6.9  
 19  RHEL Server 7.2  
 34  RHEL Server 7.3  
 30  RHEL Server 7.4  


Linux Versions and Hostnames

RHEL Server 6.5  | xxx.dnsname 

답변1

원한다면 확실히 함수에 넣을 수 있습니다. 여기에 예가 있습니다. 또한 수행 중인 처리를 줄이려고 노력합니다. 출력이 어떻게 보이는지 모르기 때문에 hammer host list원본 코드를 기반으로 추측했습니다.

do_stuff () {    
    local tmpfile=$(mktemp)
    hammer host list | grep -F 'RHEL Server' >"$tmpfile"

    printf 'Linux Versions Grouped by Count\n\n'
    awk -F '|' '{ c[$3]++ } END { for (h in c) printf("%d\t%s\n", c[h], h) }' "$tmpfile" | sort -k 2

    printf '\n\nLinux Versions and Hostnames\n\n'
    awk -F '|' '{ printf("%s | %s\n", $3, $2) }' "$tmpfile" | sort

    rm -f "$tmpfile"
}

do_stuff >rhel_things.txt

이 함수는 모든 것을 표준 출력에 쓰고, 함수가 호출되면 해당 출력이 리디렉션됩니다. 임시 파일을 사용하여 출력을 저장 hammer하고 완료되면 출력을 삭제합니다.


더 자세히 분석하고 싶다면 다음을 수행하세요.

pre_parse () {    
    local tmpfile=$(mktemp)
    hammer host list | grep -F 'RHEL Server' >"$tmpfile"

    printf '%s\n' "$tmpfile"
}

do_group_counts () {
    local infile="$1"

    printf 'Linux Versions Grouped by Count\n\n'
    awk -F '|' '{ c[$3]++ } END { for (h in c) printf("%d\t%s\n", c[h], h) }' "$infile" | sort -k 2
}

do_ver_and_hosts () {
    local infile="$1"

    printf 'Linux Versions and Hostnames\n\n'
    awk -F '|' '{ printf("%s | %s\n", $3, $2) }' "$infile" | sort
}

tmpfile=$( pre_parse )

{
    do_group_counts "$tmfile"
    printf '\n\n'
    do_ver_and_hosts  "$tmpfile"
} >rhel_stuff.out

rm -f "$tmpfile"

답변2

awk아래와 같은 프로그램으로 하면 될 것 같아요 . 언뜻 보면 실제보다 길어 보이는데, 설명적인 긴 변수 이름을 사용하고, 양심적으로 가능하면 즉시 메모리를 해제하기 때문이다.

  1. awk강력한 기본 정렬 기능이 내장되어 있으므로 외부 프로그램으로 파이프할 필요가 없습니다.

  2. awkasort함수는 asorti또한 선택적 세 번째 인수를 취합니다.정렬 방법@ind_num_asc, @ind_num_desc, @ind_num_asc, 등이 될 수 있으며 @ind_num_desc오름차순 또는 내림차순으로 정렬하는 다양한 방법으로 사용됩니다. 늘 그렇듯이 man페이지를 확인해 보세요.

  3. delete메모리 사용량을 설명하기 위해 프로그램은 명령문으로 채워지는데, 이는 데이터 세트가 커짐에 따라 문제가 될 수 있습니다.

  4. 사용할 샘플 입력 데이터를 제공하지 않은 것은 유감입니다. 코딩하면서 즐거운 시간을 보냈지만 입력 데이터 없이 작동하는 것이 얼마나 가까운지는 신만이 알고 있으므로 작동하려면 약간의 작업이 필요할 수 있는 개념 증명으로 아래 코드를 고려하십시오. 기본 요점은 가장 효율적인 방법은 아마도 awk단일 프로그램 내부에 있다는 것입니다.

hammer host list \ | awk -F'|' ' \ BEGIN {i=0} /RHEL Server/ { unsorted_count[$3]++ unsorted_list[i++]=$3"|"$2 } END { printf "\nLinux Versions Grouped by Count\n\n" i=0 for (release in unsorted_count) count_list[i++]=unsorted_count[release]"\t"release delete unsorted_count n=asort(count_list,sorted_count) delete count_list for (i=1; i<=n; i++) printf "%s\n", sorted_count[i] delete sorted_count printf "\n\nLinux Versions and Hostnames\n\n" i=0 for (hostname in unsorted_list) host_list[i++]=unsorted_list[hostname]" | "hostname delete unsorted_list n=asort(host_list,sorted_list) delete host_list for (i=1; i<=n; i++) printf "%s\n", sorted_list[i] }'

관련 정보