Bash 기술: 형식 설정 파일 에 대한 키 값 을 추가 로 삭제 할 수 있 는 Shell 스 크 립 트 를 소개 합 니 다.

14140 단어 linuxbashshell
이 글 은 형식 설정 파일 에 대한 분석 및 삭제 키 값 을 추가 로 수정 하 는 bash 셸 스 크 립 트 를 소개 합 니 다.
이 셸 스 크 립 트 처리 의 기본 설정 형식 정 보 는 다음 과 같 습 니 다. key|value스 크 립 트 에서 키 를 키 이름 이 라 고 합 니 다.value 를 키 값 이 라 고 합 니 다.
전체 키 | value 를 "키 쌍"이 라 고 합 니 다.
중간의 | 를 구분자 라 고 부른다.
기본 구분자 | 입 니 다.스 크 립 트 에 서 는 사용자 정의 할 수 있 도록 설정 함 수 를 제공 합 니 다.
이 설정 형식 을 기반 으로 아래 의 정 보 를 설정 할 수 있 습 니 다.
디 렉 터 리 경로 요약 설정
디 렉 터 리 경 로 를 간략하게 설정 합 니 다. 한 글자 또는 몇 글 자 를 통 해 깊 은 디 렉 터 리 아래로 빠르게 cd 갈 수 있 습 니 다.
예 를 들 어 설정 파일 에 다음 정보 가 있 습 니 다.
am|frameworks/base/services/core/java/com/android/server/am/  
w|frameworks/base/wifi/java/android/net/wifi/

이 설정 정 보 를 분석 할 수 있 는 quickcd.sh 스 크 립 트 가 있다 고 가정 합 니 다.quickcd.sh w 명령 을 실행 할 때 이 스 크 립 트 는 w 라 는 키 를 기반 으로 frameworks/base/wifi/java/android/net/wifi/이 키 를 가 져 옵 니 다.
그리고 스 크 립 트 에서 cd frameworks/base/wifi/java/android/net/wifi/ 명령 을 실행 하고 해당 하 는 디 렉 터 리 로 들 어 갑 니 다.
이렇게 하면 여러 문 자 를 입력 할 필요 가 없어 서 매우 편리 하 다.
뒤의 글 은 서로 다른 디 렉 터 리 사 이 를 빠르게 오 가 는 cd 스 크 립 트 를 소개 합 니 다.
또한, 분 석 된 설정 정 보 는 설정 파일 에 저 장 됩 니 다.
설정 항목 을 추가, 삭제 하려 면 설정 파일 자 체 를 수정 하면 됩 니 다. 스 크 립 트 코드 를 변경 할 필요 가 없습니다.
이렇게 하면 프로그램 데이터 와 프로그램 코드 의 분 리 를 실현 하여 재 활용 하기에 편리 하 다.
설정 명령 약자
명령 약 자 를 설정 하고 한 글자 또는 몇 글 자 를 통 해 해당 명령 을 수행 할 수 있 습 니 다.
예 를 들 어 설정 파일 에 다음 과 같은 정보 가 있 습 니 다.
l|adb logcat -b all -v threadtime
png|adb shell "screencap /sdcard/screen.png"

Android 시스템 의 adb 명령 이 설정 되 어 있 습 니 다.
유사 한 것 은 이 설정 정 보 를 분석 할 수 있 는 quickcd.sh 스 크 립 트 가 있다 고 가정 합 니 다.quickadb.sh 명령 을 실행 합 니 다. 이 스 크 립 트 는 실제 quickadb.sh l 명령 을 실행 합 니 다.
이렇게 하면 입력 을 줄 이 고 내용 이 비교적 긴 명령 을 신속하게 집행 할 수 있다.
프로필 저장 명령 을 사용 하여 약 자 를 저장 합 니 다. 명령 을 동적 으로 추가 하고 삭제 하 며 스 크 립 트 코드 와 독립 할 수 있 습 니 다.
다음 글 은 명령 을 통 해 대응 하 는 명령 을 간략하게 실행 하 는 adb logcat -b all -v threadtime 스 크 립 트 를 소개 합 니 다.
장면 총화 사용
전체적으로 말 하면, 여기 소 개 된 프로필 은 키 쌍 을 기반 으로 한 형식 입 니 다.
흔히 볼 수 있 는 사용 장면 은 비교적 간단 한 키 이름 을 제공 하여 비교적 복잡 한 키 값 을 얻 은 다음 키 값 을 사용 하여 조작 하 는 것 이다.
그러나 실제 입력 할 때 는 키 이름 만 입력 하면 되 며 입력 을 간소화 해 편리 하 게 사용 할 수 있다.
물론 실제 사용 은 이런 장면 에 국한 되 지 않 는 다.
키 값 에 대한 다른 수요 가 있 으 면 해당 하 는 장면 에서 사용 할 수 있 습 니 다.
스 크 립 트 사용 방법
이 프로필 을 분석 하 는 셸 스 크 립 트 는 독립 된 스 크 립 트 로 다른 스 크 립 트 에서 tinyshell.sh 명령 을 통 해 호출 할 수 있 습 니 다.
스 크 립 트 파일 이름 source 을 가정 하고 이 스 크 립 트 를 호출 하 는 순서 설명 은 다음 과 같 습 니 다.
  • parsecfg.sh 호출 자의 스 크 립 트 에 source parsecfg.sh 스 크 립 트 의 코드 를 도입 하여 후속 호출 parsecfg.sh 스 크 립 트 의 함 수 를 사용 합 니 다.parsecfg.sh 명령 을 통 해 호출 되 어야 스 크 립 트 의 함수, 전역 변수 값 을 공유 할 수 있 습 니 다.
  • (선택 가능) source setinfo_ifs 는 parsecfg.sh 스 크 립 트 의 함수 로 구분자 설정 에 사 용 됩 니 다.주어진 첫 번 째 매개 변 수 는 새로운 구분 자 를 지정 합 니 다.기본 구분자 는 | 입 니 다.분석 할 프로필 이 다른 구분자 로 사용 된다 면 구분자 부터 설정 하고 프로필 을 분석 해 야 합 니 다.기본 구분자 가 사용 되면 이 단 계 를 뛰 어 넘 을 수 있 습 니 다.
  • set_info_ifs separator open_config_file 은 parsecfg.sh 스 크 립 트 의 함수 로 설정 파일 을 분석 하 는 데 사 용 됩 니 다.주어진 첫 번 째 매개 변 수 는 프로필 이름 을 지정 합 니 다.
  • (선택 가능) open_config_file filename handleconfig_option 은 parsecfg.sh 스 크 립 트 의 함수 로 옵션 인 자 를 처리 합 니 다. '-l '설정 파일 자체 의 내용 을 인쇄 합 니 다.' -v '옵션 은 모든 설정 항목 의 값 을 키 쌍 으로 인쇄 합 니 다.' -i '옵션 뒤에 매개 변 수 를 따라 이 매개 변수 값 이 설정 파일 에 있 는 구체 적 인 내용 을 조회 해 야 합 니 다.' -e '수 동 으로 편집 할 수 있 도록 vim 으로 프로필 을 엽 니 다.' -a '옵션 뒤에 매개 변 수 를 따라 지정 한 키 쌍 을 설정 파일 끝 에 추가 합 니 다.' -d '옵션 뒤에 매개 변 수 를 따라 설정 파일 에서 이 매개 변수 가 있 는 줄 을 삭제 합 니 다.처리 할 옵션 이 없 으 면 이 단 계 를 뛰 어 넘 을 수 있 습 니 다.
  • 설정 파일 을 분석 한 후 handle_config_option -l|-v|-i|-e|-a|-d 스 크 립 트 가 제공 하 는 기능 함 수 를 호출 하여 조작 할 수 있 습 니 다.get_key_of_entry 함 수 는 "key | value"형식의 키 쌍 에서 key 라 는 키 이름 을 가 져 옵 니 다.get_value_of_entry 함 수 는 "key | value"형식의 키 쌍 에서 value "라 는 키 값 을 가 져 옵 니 다.get_value_by_key 함 수 는 설정 파일 에서 주어진 키 이름 을 기반 으로 해당 하 는 키 값 을 가 져 옵 니 다.search_value_from_file 함 수 는 설정 파일 에서 주어진 내용 을 찾 아 일치 하 는 줄 을 출력 합 니 다.delete_key_value 함 수 는 설정 파일 에서 키 이름 에 대응 하 는 줄 을 삭제 합 니 다.append_key_value 함 수 는 설정 파일 의 끝 에 키 값 을 추가 합 니 다.
  • parsecfg.sh 스 크 립 트 코드parsecfg.sh 스 크 립 트 의 구체 적 인 코드 는 다음 과 같 습 니 다.
    이 코드 에 서 는 거의 모든 줄 의 코드 가 상세 한 주석 을 제공 하여 읽 기 에 편리 하 다.
    이 글 의 뒤에 도 참고 할 호출 예 를 제공 하여 이해 에 도움 이 될 것 이다.
    #!/bin/bash
    #              、            .
    #         : key|value.          :
    # 1.       key        value.
    # 2.         .
    # 3.   vim       ,    .
    # 4.                  .
    # 5.               key       .
    #     |             .    set_info_ifs()        .
    
    #               .
    PARSECFG_filepath=""
    
    #                 .        '|'.
    #      set_info_ifs()           ,       .
    info_ifs="|"
    
    ########                  ########
    
    #            ,          ,       .
    #   echo           .               .
    #   echo      '*'  ,       , '*'        
    #    ,          .                .
    get_key_of_entry()
    {
        local entry="$1"
        # ${param%%pattern}           ,         .
        echo "${entry%%${info_ifs}*}"
    }
    
    #            ,          ,       .
    get_value_of_entry()
    {
        local entry="$1"
        # ${param#pattern}           ,         .
        echo "${entry#*${info_ifs}}"
    }
    
    #             key_values            .
    #     ,         ,                 .
    #                     .          
    #      ,     .                  .
    get_value_by_key()
    {
        #                .
        local key="$1"
        #                 ,      .
        echo "${key_values["${key}"]}"
    }
    
    #                      .
    delete_entry_by_key()
    {
        #                ,         .
        local key="$1"
        #     ${key}     ^,  ${key}     .
        sed -i "/^${key}|/d" "${PARSECFG_filepath}"
        #                    .
        # key_values["${key}"]=""
        #       ,            .    unset name[subscript]
        #              .    ,               .
        #                 . unset              
        #   .    key_values[s]  ,          key_valuess  ,
        #   key_values[s]    key_valuess,          s     .
        #         ,               ,        .
        unset "key_values[${key}]"
    }
    
    #        ,             
    delete_key_value()
    {
        if [ $# -ne 1 ]; then
            echo "Usage: $FUNCNAME key_name"
            return 1
        fi
        local key="$1"
    
        #                  ,get_value_by_key()    
        #       .           ,         .
        local value=$(get_value_by_key "${key}")
        if test -n "${value}"; then
            delete_entry_by_key "${key}"
        else
            echo "  :         '${key}'     "
        fi
    }
    
    #                  ,    get_value_by_key()
    #                   ,   ,          .
    #   ,                   .
    append_key_value()
    {
        if [ $# -ne 1 ]; then
            echo "Usage: $FUNCNAME key_value"
            return 1
        fi
        #                .
        local full_entry="$1"
    
        #              
        local key_name=$(get_key_of_entry "${full_entry}")
        #                .        ,         
        #       ,         ,                 .
        local match_value=$(get_value_by_key "${key_name}")
        if test -n "${match_value}"; then
            echo "   ${key_name}${info_ifs}${match_value}  : ${full_entry}"
            delete_entry_by_key "${key_name}"
        fi
    
        #               
        echo "${full_entry}" >> "${PARSECFG_filepath}"
        #              key_values    ,          .
        key_values["${key_name}"]="$(get_value_of_entry "${full_entry}")"
    }
    
    #    cat                   .
    show_config_file()
    {
        echo "           :"
        cat "${PARSECFG_filepath}"
    }
    
    #                 .
    show_key_values()
    {
        local key_name
        # ${!array[@]}           . ${array[@]}          .
        #            ,          ,            .
        for key_name in "${!key_values[@]}"; do
            printf "key='\e[32m${key_name}\e[0m' \t"
            printf "value='\e[33m${key_values["${key_name}"]}\e[0m'
    " done } # vim , . : vim , # , , . # , , open_config_file , . edit_config_file() { vim "${PARSECFG_filepath}" # open_config_file() , key_values . open_config_file "${PARSECFG_filepath}" } # , . search_value_from_file() { # ,grep , . grep "$1" "${PARSECFG_filepath}" if [ $? -ne 0 ]; then echo " '$1'" return 1 fi } ######## ######## # . # , . set_info_ifs() { if [ $# -ne 1 ]; then echo "Usage: $FUNCNAME separator" return 1 fi if [ -n "${PARSECFG_filepath}" ]; then # , . # , . # , , open_config_file() # , . echo " : set_info_ifs, open_config_file." return 2 fi info_ifs="$1" } # , . # , . , # . , . open_config_file() { if [ $# -ne 1 ]; then echo "Usage: $FUNCNAME config_filename" return 1 fi # , . if [ ! -f "${1}" ]; then echo "ERROR: the file '${1}' does not exist" return 2 fi # , PARSECFG_filepath . # readlink -f , . # , . cd , # , -l . PARSECFG_filepath="$(readlink -f $1)" # , . key_values , # source , key_values , # . declare , , local # . declare -g . unset key_values declare -g -A key_values local key value entryline # , , # key_values . . , . while read entryline; do # , ${entryline} # , , , . # ${entryline} service list, ,get_value_of_entry() # , $1, service, $2, # list, get_value_of_entry() , # . , . key=$(get_key_of_entry "${entryline}") value=$(get_value_of_entry "${entryline}") # , key_values[] '=' , [] # , unset # . key_values["${key}"]="${value}" # . , . # echo "entryline=${entryline}" # echo "key=${key}" # echo "value=${value}" done < "${PARSECFG_filepath}" # key_values . , . # declare -p key_values } # . . # : # : , '-' , . # : . . # handle_config_option() , . # , 0, 0. , 127. handle_config_option() { if [ -z "${PARSECFG_filepath}" ]; then # , , . echo " : open_config_file filename ." return 1 fi local option="$1" local argument="$2" case "${option}" in -l) show_config_file ;; -v) show_key_values ;; -i) search_value_from_file "${argument}" ;; -e) edit_config_file ;; -a) append_key_value "${argument}" ;; -d) delete_key_value "${argument}" ;; *) return 127 ;; esac # return , . return }

    사용 parsecfg.sh 스 크 립 트 의 예
    만약 에 parsecfg.sh 스 크 립 트 가 있다 고 가정 하면 구체 적 인 코드 내용 은 다음 과 같다.
    #!/bin/bash
    
    CFG_FILE="cfgfile.txt"
    
    #    source      parsecfg.sh      
    source parsecfg.sh
    
    #    open_config_file         
    open_config_file "$CFG_FILE"
    
    #    handle_config_option      -v   .
    #                  .
    handle_config_option -v
    
    #    am          
    value=$(get_value_by_key "am")
    echo "The value of 'am' key is: $value"
    
    #    get_key_of_entry            .   
    #            ,               .
    key=$(get_key_of_entry "a|adb logcat -b all")
    echo "The key of 'a|adb logcat -b' is: $key"

    이 스 크 립 트 에서 호출 된 함 수 는 모두 parsecfg.sh 스 크 립 트 에서 나 옵 니 다.
    testparsecfg.sh 스 크 립 트 는 cfgfile. txt 설정 파일 을 분석 할 것 을 지정 합 니 다.
    이 프로필 의 내용 은 다음 과 같 습 니 다.
    am|frameworks/base/services/core/java/com/android/server/am/
    w|frameworks/base/wifi/java/android/net/wifi/
    parsecfg.sh 스 크 립 트, testparsecfg.sh 스 크 립 트, cfgfile. txt 설정 파일 을 같은 디 렉 터 리 에 놓 습 니 다.
    그리고 이 두 스 크 립 트 파일 에 실행 가능 한 권한 을 추가 합 니 다.
    실행 parsecfg.sh 스 크 립 트, 구체 적 인 결 과 는 다음 과 같 습 니 다.
    $ ./testparsecfg.sh
    key='am'        value='frameworks/base/services/core/java/com/android/server/am/'
    key='w'         value='frameworks/base/wifi/java/android/net/wifi/'
    The value of 'am' key is: frameworks/base/services/core/java/com/android/server/am/
    The key of 'a|adb logcat -b' is: a
    testparsecfg.sh 스 크 립 트 에서 testparsecfg.sh 명령 을 통 해 testparsecfg.sh 스 크 립 트 를 도입 하 는 것 을 볼 수 있 습 니 다.
    이후 source 스 크 립 트 의 코드 를 호출 하여 프로필 을 분석 할 수 있어 편리 합 니 다.
    여러 스 크 립 트 가 여러 개의 서로 다른 프로필 을 분석 해 야 한다 면 각 스 크 립 트 에 parsecfg.sh 스 크 립 트 를 도입 한 다음 서로 다른 프로필 이름 을 제공 하면 됩 니 다.

    좋은 웹페이지 즐겨찾기