Bash 기술: 형식 설정 파일 에 대한 키 값 을 추가 로 삭제 할 수 있 는 Shell 스 크 립 트 를 소개 합 니 다.
이 셸 스 크 립 트 처리 의 기본 설정 형식 정 보 는 다음 과 같 습 니 다.
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
스 크 립 트 를 도입 한 다음 서로 다른 프로필 이름 을 제공 하면 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.