File is not defined explicitely rather than globally

This commit is contained in:
ayakael 2018-03-26 22:39:58 -04:00
parent e7f6e27c61
commit a624cae51b
No known key found for this signature in database
GPG key ID: 575626A4AE5F4026
2 changed files with 69 additions and 67 deletions

View file

@ -9,11 +9,9 @@
# Reads and writes config files delimited by tabs, like fstab, using awk. # Reads and writes config files delimited by tabs, like fstab, using awk.
# #
# USAGE # USAGE
# _cfg <command> <arg> # _cfg <file> <command> <arg>
# #
# COMMANDS # COMMANDS
# set-file <path/to/file>
# Sets path to file
# #
# create <column-names> # create <column-names>
# Creates config file and assigns <column-names>. # Creates config file and assigns <column-names>.
@ -50,11 +48,12 @@
_cfg_column_to_nf() { _cfg_column_to_nf() {
# Argument parser and sanity check # Argument parser and sanity check
[[ -z ${1+x} ]] && { _msg ECHO "_cfg_column_to_nf(): Expected column name"; return 1; } [[ $# != 2 ]] && { _msg ECHO "_cfg_column_to_nf(): Expected 2 arguments"; return 1; }
local COLUMN=${1} local FILE="${1}"
local COLUMN=${2}
# Queries list of columns # Queries list of columns
local columnList=(all $(awk 'BEGIN {FS="\t"; OFS="\t"}; {if (NR == 1 ) {print $0}}' ${_CFG_PATH})) local columnList=(all $(awk 'BEGIN {FS="\t"; OFS="\t"}; {if (NR == 1 ) {print $0}}' ${FILE}))
# Checks if queried ${COLUMN} exists # Checks if queried ${COLUMN} exists
if ! _if_array_contains ${COLUMN} ${columnList[@]}; then if ! _if_array_contains ${COLUMN} ${columnList[@]}; then
@ -71,75 +70,80 @@ _cfg_column_to_nf() {
fi fi
} }
_cfg_set_file() { _cfg_tmp_file() {
# Argument parser and sanity check local FILE="${1}"
[[ $# != 1 ]] && { _msg ECHO "_cfg_set_file(): Expected 1 argument"; return 1; }
# Sets _CFG_PATH globally echo -n "$(dirname ${FILE})/.$(basename ${FILE})"
_CFG_PATH="${1}"
_CFG_TMP_PATH="$(sed 's|\(.*\)\/|\1/.|' <<<"${_CFG_PATH}")"
} }
_cfg_create() { _cfg_create() {
# Argument parser and sanity check # Argument parser and sanity check
[[ -z ${1+x} ]] && { _msg ECHO "_cfg_create(): Expected argument"; return 1; } [[ $# -lt 2 ]] && { _msg ECHO "_cfg_create(): Expected at least 2 arguments"; return 1; }
local FILE="${1}"; shift
local colList=(${@}) local colList=(${@})
# Creates config file # Creates config file
printf "%s\t" ${colList[@]} | awk 'BEGIN{OFS="\t";} {printf "%s\n",$0}' >> ${_CFG_PATH} printf "%s\t" ${colList[@]} | awk 'BEGIN{OFS="\t";} {printf "%s\n",$0}' >> ${FILE}
} }
_cfg_print() { _cfg_print() {
# Argument parser and sanity check # Argument parser and sanity check
[[ $# != 2 ]] && { _msg ECHO "_cfg_print(): Expected 2 arguments"; return 1; } [[ $# != 3 ]] && { _msg ECHO "_cfg_print(): Expected 3 arguments"; return 1; }
local COLUMN=${1} local FILE="${1}"
local ROW=${2} local COLUMN=${2}
local ROW=${3}
# Prints row of ${_CFG_PATH} # Prints row of ${_CFG_PATH}
awk 'BEGIN {OFS="\t"}; {if (NR == '${ROW}') {print $'$(_cfg_column_to_nf ${COLUMN})'}}' "${_CFG_PATH}" awk 'BEGIN {OFS="\t"}; {if (NR == '${ROW}') {print $'$(_cfg_column_to_nf ${COLUMN})'}}' "${FILE}"
} }
_cfg_change() { _cfg_change() {
# Argument parser and sanity check # Argument parser and sanity check
[[ $# != 3 ]] && { _msg ECHO "_cfg_change(): Expected 3 arguments"; return 1; } [[ $# != 4 ]] && { _msg ECHO "_cfg_change(): Expected 4 arguments"; return 1; }
local COLUMN=${1} local FILE="${1}"
local ROW=${2} local COLUMN=${2}
local VALUE=${3} local ROW=${3}
local VALUE=${4}
local TMP_FILE=$(_cfg_tmp_file ${FILE})
local COLUMN_NO=$(_cfg_column_to_nf ${COLUMN}) local COLUMN_NO=$(_cfg_column_to_nf ${COLUMN})
_if_is_integer ${ROW} || { _msg ECHO "_cfg_change(): Expected integer"; return 1; } _if_is_integer ${ROW} || { _msg ECHO "_cfg_change(): Expected integer"; return 1; }
[[ ${ROW} > $(awk 'BEGIN{FS="\t"; OFS="\t"}; {print NR}' ${_CFG_PATH} | wc -l) ]] && { _msg ECHO "_cfg_change(): Row ${ROW} does not exist"; return 1; } [[ ${ROW} > $(awk 'BEGIN{FS="\t"; OFS="\t"}; {print NR}' ${_CFG_PATH} | wc -l) ]] && { _msg ECHO "_cfg_change(): Row ${ROW} does not exist"; return 1; }
# Writes new version of file # Writes new version of file
awk 'BEGIN {OFS="\t"}; {if (NR == '${ROW}') {$'${COLUMN_NO}'="'${VALUE}'"} {print $0}}' "${_CFG_PATH}" > ${_CFG_TMP_PATH} && mv ${_CFG_TMP_PATH} ${_CFG_PATH} awk 'BEGIN {OFS="\t"}; {if (NR == '${ROW}') {$'${COLUMN_NO}'="'${VALUE}'"} {print $0}}' "${FILE}" > ${TMP_FILE} && mv ${TMP_FILE} ${FILE}
} }
_cfg_drop() { _cfg_drop() {
# Argument parser and sanity check # Argument parser and sanity check
[[ $# != 2 ]] && { _msg ECHO "_cfg_drop(): Expected 2 arguments"; return 1; } [[ $# != 3 ]] && { _msg ECHO "_cfg_drop(): Expected 3 arguments"; return 1; }
local SUBCMD=${1}; shift local SUBCMD=${1}; shift
_if_array_contains ${SUBCMD} row column || { _msg ECHO "_cfg_drop(): Expected 'row' or 'column' as subcommand"; return 1; } _if_array_contains ${SUBCMD} row column || { _msg ECHO "_cfg_drop(): Expected 'row' or 'column' as subcommand"; return 1; }
# Dispatcher # Dispatcher
eval _cfg_drop_${SUBCMD} ${1} eval _cfg_drop_${SUBCMD} ${@}
} }
_cfg_drop_row() { _cfg_drop_row() {
# Argument parser and sanity check # Argument parser and sanity check
local ROW=${1} local FILE="${1}"
[[ ${ROW} > $(awk 'BEGIN {FS="\t"; OFS="\t"}; {print NR}' ${_CFG_PATH} | wc -l) ]] && { _msg ECHO "_cfg_drop_row(): Row ${ROW} does not exist"; return 1; } local TMP_FILE="$(_cfg_tmp_file ${FILE})"
local ROW=${2}
[[ ${ROW} > $(awk 'BEGIN {FS="\t"; OFS="\t"}; {print NR}' ${FILE} | wc -l) ]] && { _msg ECHO "_cfg_drop_row(): Row ${ROW} does not exist"; return 1; }
# Writes new version of file # Writes new version of file
awk 'BEGIN {OFS="\t"}; {if (NR != '${ROW}') {print $0}}' ${_CFG_PATH} > ${_CFG_TMP_PATH} && mv ${_CFG_TMP_PATH} ${_CFG_PATH} awk 'BEGIN {OFS="\t"}; {if (NR != '${ROW}') {print $0}}' ${FILE} > ${TMP_FILE} && mv ${TMP_FILE} ${FILE}
} }
_cfg_drop_column() { _cfg_drop_column() {
local COLUMN=${1} local FILE="${1}"
local TMP_FILE="$(_cfg_tmp_file ${FILE})"
local COLUMN=${2}
local NF=$(_cfg_column_to_nf "${COLUMN}") local NF=$(_cfg_column_to_nf "${COLUMN}")
# Writes new version of file # Writes new version of file
awk 'BEGIN {OFS="\t"}; $'${NF}'="";1' ${_CFG_PATH} > ${_CFG_TMP_PATH} && mv ${_CFG_TMP_PATH} ${_CFG_PATH} awk 'BEGIN {OFS="\t"}; $'${NF}'="";1' ${FILE} > ${TMP_FILE} && mv ${TMP_FILE} ${FILE}
} }
_cfg_insert() { _cfg_insert() {
@ -154,29 +158,33 @@ _cfg_insert() {
_cfg_insert_column() { _cfg_insert_column() {
[[ $# != 1 ]] && { _msg ECHO "_cfg_insert_column(): Expected 1 argument"; return 1; } [[ $# != 1 ]] && { _msg ECHO "_cfg_insert_column(): Expected 1 argument"; return 1; }
# Argument parser and sanity check # Argument parser and sanity check
local VALUE=${1} local FILE="${1}"
local NX_COLUMN=$(( $(awk 'BEGIN{OFS="\t"}; {if (NR == 1) {print NF}}' ${_CFG_PATH}) + 1 )) local TMP_FILE="$(_cfg_tmp_file ${FILE})"
local VALUE=${2}
local NX_COLUMN=$(( $(awk 'BEGIN{OFS="\t"}; {if (NR == 1) {print NF}}' ${FILE}) + 1 ))
# Write new version of header into file # Write new version of header into file
awk 'BEGIN {OFS="\t"}; {if (NR == 1) {$'${NX_COLUMN}'="'${VALUE}'"} {print $0}}' "${_CFG_PATH}" > ${_CFG_TMP_PATH} && mv ${_CFG_TMP_PATH} ${_CFG_PATH} awk 'BEGIN {OFS="\t"}; {if (NR == 1) {$'${NX_COLUMN}'="'${VALUE}'"} {print $0}}' "${FILE}" > ${TMP_FILE} && mv ${TMP_FILE} ${FILE}
} }
_cfg_insert_row() { _cfg_insert_row() {
[[ -z ${1+x} ]] && { _msg ECHO "_cfg_insert_row(): Expected at least 1 argument"; return 1; } [[ -z ${1+x} ]] && { _msg ECHO "_cfg_insert_row(): Expected at least 1 argument"; return 1; }
# Argument parser and sanity check # Argument parser and sanity check
local FILE="${1}"; shift
local valueList=(${@}) local valueList=(${@})
local COLUMN_NO=$(awk 'BEGIN{OFS="\t"}; {if (NR == 1) {print NF}}' ${_CFG_PATH}) local COLUMN_NO=$(awk 'BEGIN{OFS="\t"}; {if (NR == 1) {print NF}}' ${FILE})
[[ "${#valueList[@]}" != "${COLUMN_NO}" ]] && { _msg ECHO "_cfg_insert_row(): Number of arguments must be equal to ${COLUMN_NO}"; return 1; } [[ "${#valueList[@]}" != "${COLUMN_NO}" ]] && { _msg ECHO "_cfg_insert_row(): Number of arguments must be equal to ${COLUMN_NO}"; return 1; }
# Write row into file # Write row into file
printf "%s\t" ${valueList[@]} | awk 'BEGIN{OFS="\t";} {printf "%s\n",$0}' >> ${_CFG_PATH} printf "%s\t" ${valueList[@]} | awk 'BEGIN{OFS="\t";} {printf "%s\n",$0}' >> ${FILE}
} }
_cfg_query() { _cfg_query() {
# Argument parser and sanity check # Argument parser and sanity check
local CONDITION="${1}" local FILE="${1}"
local CONDITION="${2}"
awk 'BEGIN {FS="\t"; OFS="\t"}; {if ('${CONDITION}') {print NR}}' "${_CFG_PATH}" awk 'BEGIN {FS="\t"; OFS="\t"}; {if ('${CONDITION}') {print NR}}' "${FILE}"
} }
_cfg() { _cfg() {

View file

@ -1,10 +1,12 @@
#!/bin/bash #!/bin/bash
source ../lib/if.sh source ../srv/if.sh
source ../lib/ansi.sh source ../src/ansi.sh
source ../lib/msg.sh source ../src/msg.sh
source ../lib/cfg.sh source ../src/cfg.sh
TMP=/tmp TMP=/tmp
FILE=${TMP}/cfg.db
TMP_FILE=${TMP}/.cfg.db
testcolList=(COL1 COL2 COL3 COL4 COL5) testcolList=(COL1 COL2 COL3 COL4 COL5)
# cfg test # cfg test
@ -14,17 +16,9 @@ bail() {
exit 1 exit 1
} }
_test_cfg_set_file() {
_msg EXEC "Testing _cfg_set_file()"
_cfg_set_file ${TMP}/test.cfg
[[ "${_CFG_PATH}" != "${TMP}/test.cfg" ]] && { _msg FAIL "_test_cfg_set_file(): \${_CFG_PATH} is '${_CFG_PATH}' rather than the expected '${TMP}/test.cfg'"; }
[[ "${_CFG_TMP_PATH}" != "${TMP}/.test.cfg" ]] && { _msg FAIL "_test_cfg_set_file(): \${_CFG_TMP_PATH} is '${_CFG_TMP_PATH}' rather than the expected '${TMP}/.test.cfg"; }
_msg OK
}
_test_cfg_create() { _test_cfg_create() {
_msg EXEC "Testing _cfg_create()" _msg EXEC "Testing _cfg_create()"
local CMD="_cfg_create ${testcolList[@]}" local CMD="_cfg_create ${FILE} ${testcolList[@]}"
eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_create(): Error in function execution"; } eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_create(): Error in function execution"; }
local FC_OUTPUT="$(cat ${TMP}/test.cfg)" local FC_OUTPUT="$(cat ${TMP}/test.cfg)"
@ -35,7 +29,7 @@ _test_cfg_create() {
_test_cfg_column_to_nf() { _test_cfg_column_to_nf() {
_msg EXEC "Testing _cfg_column_to_nf()" _msg EXEC "Testing _cfg_column_to_nf()"
local argList=(all ${testcolList[@]}) local argList=(${FILE} all ${testcolList[@]})
_cfg_column_to_nf ${argList[1]} >${STDERR} 2>&1 || { _msg FAIL "test_cfg_column_to_nf(): Error in function execution"; } _cfg_column_to_nf ${argList[1]} >${STDERR} 2>&1 || { _msg FAIL "test_cfg_column_to_nf(): Error in function execution"; }
for no in {0..5}; do for no in {0..5}; do
@ -48,7 +42,7 @@ _test_cfg_column_to_nf() {
_test_cfg_print() { _test_cfg_print() {
_msg EXEC "Testing _cfg_print()" _msg EXEC "Testing _cfg_print()"
local argList=(all 1) local argList=(${FILE} all 1)
local CMD="_cfg_print ${argList[@]}" local CMD="_cfg_print ${argList[@]}"
eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_print(): Error in function execution"; } eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_print(): Error in function execution"; }
@ -60,7 +54,7 @@ _test_cfg_print() {
_test_cfg_insert_row() { _test_cfg_insert_row() {
_msg EXEC "Testing _cfg_insert_row()" _msg EXEC "Testing _cfg_insert_row()"
local argList=(EL1 EL2 EL3 EL4 EL5) local argList=(${FILE} EL1 EL2 EL3 EL4 EL5)
local CMD="_cfg_insert_row ${argList[@]}" local CMD="_cfg_insert_row ${argList[@]}"
eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_insert_row(): Error in function execution"; } eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_insert_row(): Error in function execution"; }
@ -68,13 +62,13 @@ _test_cfg_insert_row() {
local EX_OUTPUT="$(printf '%s\t' ${argList[@]})" local EX_OUTPUT="$(printf '%s\t' ${argList[@]})"
[[ "${FC_OUTPUT}" != "${EX_OUTPUT}" ]] && { _msg FAIL "_test_cfg_insert_row(): Output '${FC_OUTPUT}' expected to be '${EX_OUTPUT}'"; } [[ "${FC_OUTPUT}" != "${EX_OUTPUT}" ]] && { _msg FAIL "_test_cfg_insert_row(): Output '${FC_OUTPUT}' expected to be '${EX_OUTPUT}'"; }
awk 'BEGIN {OFS="\t"}; {if (NR != 2) {print $0}}' ${_CFG_PATH} > ${_CFG_TMP_PATH} && mv ${_CFG_TMP_PATH} ${_CFG_PATH} awk 'BEGIN {OFS="\t"}; {if (NR != 2) {print $0}}' ${FILE} > ${TMP_FILE} && mv ${TMP_FILE} ${FILE}
_msg OK _msg OK
} }
_test_cfg_insert_column() { _test_cfg_insert_column() {
_msg EXEC "Testing _cfg_insert_column()" _msg EXEC "Testing _cfg_insert_column()"
local argList=(COL6) local argList=(${FILE} COL6)
local CMD="_cfg_insert_column ${argList[@]}" local CMD="_cfg_insert_column ${argList[@]}"
eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_insert_column(): Error in function execution"; } eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_insert_column(): Error in function execution"; }
@ -83,27 +77,27 @@ _test_cfg_insert_column() {
[[ "${fcoutputList[@]}" != "${exoutputList[@]}" ]] && { _msg FAIL "_test_cfg_insert_column(): Output '${fcoutputList[@]}' expected to be '${exoutputList[@]}'"; } [[ "${fcoutputList[@]}" != "${exoutputList[@]}" ]] && { _msg FAIL "_test_cfg_insert_column(): Output '${fcoutputList[@]}' expected to be '${exoutputList[@]}'"; }
awk 'BEGIN {OFS="\t"}; {$6=""; print $0}' ${_CFG_PATH} > ${_CFG_TMP_PATH} && mv ${_CFG_TMP_PATH} ${_CFG_PATH} awk 'BEGIN {OFS="\t"}; {$6=""; print $0}' ${FILE} > ${TMP_FILE} && mv ${TMP_FILE} ${FILE}
_msg OK _msg OK
} }
_test_cfg_change() { _test_cfg_change() {
_msg EXEC "Testing _cfg_change()" _msg EXEC "Testing _cfg_change()"
_cfg_insert_row ${testcolList[@]} _cfg_insert_row ${FILE} ${testcolList[@]}
local argList=(COL1 2 EL1_CH) local argList=(${FILE} COL1 2 EL1_CH)
local CMD="_cfg_change ${argList[@]}" local CMD="_cfg_change ${argList[@]}"
eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_change(): Error in function execution"; } eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_change(): Error in function execution"; }
local FC_OUTPUT="$(_cfg_print COL1 2)" local FC_OUTPUT="$(_cfg_print COL1 2)"
local EX_OUTPUT="EL1_CH" local EX_OUTPUT="EL1_CH"
[[ "${FC_OUTPUT}" != "${EX_OUTPUT}" ]] && { _msg FAIL "_test_cfg_change(): Output '${FC_OUTPUT}' expected to be '${EX_OUTPUT}'"; } [[ "${FC_OUTPUT}" != "${EX_OUTPUT}" ]] && { _msg FAIL "_test_cfg_change(): Output '${FC_OUTPUT}' expected to be '${EX_OUTPUT}'"; }
_cfg_drop_row 2 _cfg_drop_row ${FILE} 2
_msg OK _msg OK
} }
_test_cfg_drop_row() { _test_cfg_drop_row() {
_msg EXEC "Testing _cfg_drop_row()" _msg EXEC "Testing _cfg_drop_row()"
_cfg_insert_row ${testcolList[@]} _cfg_insert_row ${FILE} ${testcolList[@]}
local argList=(2) local argList=(${FILE} 2)
local CMD="_cfg_drop_row ${argList[@]}" local CMD="_cfg_drop_row ${argList[@]}"
eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_drop_row(): Error in function execution"; } eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_drop_row(): Error in function execution"; }
@ -115,12 +109,12 @@ _test_cfg_drop_row() {
_test_cfg_drop_column() { _test_cfg_drop_column() {
_msg EXEC "Testing _cfg_drop_column()" _msg EXEC "Testing _cfg_drop_column()"
_cfg_insert_column "COL6" _cfg_insert_column ${FILE} "COL6"
local argList="COL6" local argList="COL6"
local CMD="_cfg_drop_column ${argList[@]}" local CMD="_cfg_drop_column ${argList[@]}"
eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_drop_column(): Error in function execution"; } eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_drop_column(): Error in function execution"; }
FC_OUTPUT="$(printf '%s ' $(awk 'BEGIN{OFS="\t"}; {if (NR == 1) {print $0}}' ${_CFG_PATH}))" FC_OUTPUT="$(printf '%s ' $(awk 'BEGIN{OFS="\t"}; {if (NR == 1) {print $0}}' ${FILE}))"
EX_OUTPUT="$(printf '%s ' ${testcolList[@]})" EX_OUTPUT="$(printf '%s ' ${testcolList[@]})"
[[ "${FC_OUTPUT}" != "${EX_OUTPUT}" ]] && { _msg FAIL "_test_cfg_drop_column(): Output '${FC_OUTPUT}' expected to be '${EX_OUTPUT}'"; } [[ "${FC_OUTPUT}" != "${EX_OUTPUT}" ]] && { _msg FAIL "_test_cfg_drop_column(): Output '${FC_OUTPUT}' expected to be '${EX_OUTPUT}'"; }
_msg OK _msg OK
@ -128,17 +122,17 @@ _test_cfg_drop_column() {
_test_cfg_query() { _test_cfg_query() {
_msg EXEC "Testing _cfg_query" _msg EXEC "Testing _cfg_query"
_cfg_insert_row "EL1 EL2 EL3 EL4 EL5" _cfg_insert_row ${FILE} "EL1 EL2 EL3 EL4 EL5"
_cfg_insert_row "EL6 EL7 EL8 EL9 EL10" _cfg_insert_row ${FILE} "EL6 EL7 EL8 EL9 EL10"
local ARG='$1=="EL6"' local ARG='$1=="EL6"'
local CMD="_cfg_query '${ARG}'" local CMD="_cfg_query ${FILE} '${ARG}'"
eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_query(): Error in function execution"; } eval ${CMD} >${STDERR} 2>&1 || { _msg FAIL "_test_cfg_query(): Error in function execution"; }
FC_OUTPUT=$(eval ${CMD}) FC_OUTPUT=$(eval ${CMD})
EX_OUTPUT=3 EX_OUTPUT=3
[[ "${FC_OUTPUT}" != "${EX_OUTPUT}" ]] && { _msg FAIL "_test_cfg_query(): Output '${FC_OUTPUT}' expected to be '${EX_OUTPUT}'"; } [[ "${FC_OUTPUT}" != "${EX_OUTPUT}" ]] && { _msg FAIL "_test_cfg_query(): Output '${FC_OUTPUT}' expected to be '${EX_OUTPUT}'"; }
awk 'BEGIN {OFS="\t"}; {if (NR == 1) {print $0}}' ${_CFG_PATH} > ${_CFG_TMP_PATH} && mv ${_CFG_TMP_PATH} ${_CFG_PATH} awk 'BEGIN {OFS="\t"}; {if (NR == 1) {print $0}}' ${FILE} > ${TMP_FILE} && mv ${TMP_FILE} ${FILE}
_msg OK _msg OK
} }