Created
June 2, 2021 10:30
-
-
Save Hayao0819/a075cdce7f1a1c0386e1604a8f5e2a19 to your computer and use it in GitHub Desktop.
crshini (シェルで書かれたiniファイルを解析する関数)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
set -eu | |
_crshini_msg_err(){ echo "[libcrshini] Error ${*}" >&2; } | |
_crshini_msg_inf(){ echo "[libcrshini] Info ${*}" >&1; } | |
_crshini_msg_wrn(){ echo "[libcrshini] Warn ${*}" >&2; } | |
_crshini_msg_dbg(){ | |
if [[ "${_crshini_debug-false}" = true ]]; then | |
echo "[libcrshini] Debug ${*}" >&2 | |
fi | |
} | |
# Get index number from string | |
# _crshini_index_from_str string "${array[@]}" | |
_crshini_index_from_str(){ | |
local __string_to_find="${1}" __index | |
shift 1 | |
local __array=("${@}") | |
for __index in $(seq 0 "$(( "${#__array[@]}" - 1 ))"); do | |
[[ "${__array["${__index}"]}" = "${__string_to_find}" ]] && echo "${__index}" | |
done | |
return 0 | |
} | |
# --get command | |
# _crshini_get file [section] [param] | |
_crshini_get(){ | |
local _crshini_get_fileline=() _crshini_get_file="${1}" | |
readarray -t _crshini_get_fileline < "${_crshini_get_file}" | |
local _crshini_get_section="${2-""}" _crshini_get_param="${3-""}" __line | |
if [[ -z "${_crshini_get_section}" ]]; then | |
for __line in "${_crshini_get_fileline[@]}"; do | |
[[ "${__line}" = "["*"]" ]] && echo "${__line#[%]}" | |
done | |
else | |
for __line in "${_crshini_get_fileline[@]}"; do | |
case "${__line}" in | |
"[${_crshini_get_section}]") | |
_in_section=true | |
continue | |
;; | |
"["*"]") | |
_in_section=false | |
continue | |
;; | |
"" | "#"*) | |
continue | |
;; | |
esac | |
if [[ "${_in_section}" = true ]]; then | |
if [[ -z "${_crshini_get_param}" ]]; then | |
echo "${__line%%=*}" | |
elif [[ "${__line%%=*}" = "${_crshini_get_param}" ]]; then | |
echo "${__line##*=}" | |
fi | |
fi | |
done | |
fi | |
return 0 | |
} | |
# --set command | |
# _crshini_set file section [param] [value] | |
_crshini_set(){ | |
local _crshini_set_fileline=() _crshini_set_file="${1}" | |
readarray -t _crshini_set_fileline < "${_crshini_set_file}" | |
local _crshini_set_section="${2}" _crshini_set_param="${3-""}" _crshini_set_value="${4-""}" | |
local __line | |
local _crshini_set_newsection=false | |
# Copy | |
local _crshini_set_modline | |
readarray -t _crshini_set_sectionlist < <(_crshini_get "${_crshini_set_file}") | |
readarray -t _crshini_set_paramlist < <(_crshini_get "${_crshini_set_file}" "${_crshini_set_section}") | |
# Find section | |
if ! printf "%s\n" "${_crshini_set_sectionlist[@]}" | grep -x "\[${_crshini_set_section}\]" 1> /dev/null 2>&1; then | |
_crshini_set_newsection=true | |
fi | |
# Set section | |
if [[ "${_crshini_set_newsection}" = true ]]; then | |
_crshini_set_fileline+=("[${_crshini_set_section}]") | |
_crshini_set_sectionlist+=("${_crshini_set_section}") | |
fi | |
# Set param | |
# 指定されたセクションの最後の行数を取得 | |
_crshini_set_section_last="$( | |
if (( "${#_crshini_set_paramlist[@]}" == 0 )); then | |
_crshini_index_from_str "[${_crshini_set_section}]" "${_crshini_set_fileline[@]}" | |
else | |
for __line in $( seq 0 $(( "${#_crshini_set_fileline[@]}" - 1 )) ); do | |
if [[ "${_crshini_set_fileline[${__line}]}" = "${_crshini_set_paramlist[-1]}"*"="*"$(_crshini_get "${_crshini_set_file}" "${_crshini_set_section}" "${_crshini_set_paramlist[-1]}")" ]]; then | |
echo "${__line}" | |
exit 0 | |
fi | |
done | |
echo "$(( "${#_crshini_set_fileline[@]}" - 1 ))" | |
fi | |
)" | |
for __line in $( seq 0 $(( "${#_crshini_set_fileline[@]}" )) ); do | |
_crshini_msg_dbg "${__line}" | |
if ! (( __line == $(( _crshini_set_section_last + 1 )) )); then | |
if [[ -n "${_crshini_set_fileline[${__line}]+SET}" ]]; then | |
_crshini_set_modline+=("${_crshini_set_fileline[${__line}]}") | |
fi | |
else | |
_crshini_set_modline+=("${_crshini_set_param}=${_crshini_set_value}" "") | |
fi | |
done | |
# Output | |
printf "%s\n" "${_crshini_set_modline[@]}" | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment