Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hayao0819/a075cdce7f1a1c0386e1604a8f5e2a19 to your computer and use it in GitHub Desktop.
Save Hayao0819/a075cdce7f1a1c0386e1604a8f5e2a19 to your computer and use it in GitHub Desktop.
crshini (シェルで書かれたiniファイルを解析する関数)
#!/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