Практическое написание сценариев командной оболочки Bash/Код-сниппеты: различия между версиями
Практическое написание сценариев командной оболочки Bash/Код-сниппеты (править)
Версия от 08:36, 18 октября 2021
, 1 год назад→Своя реализация утилиты column
fi
__settings[col_set]=${__settings[col_set]#?}
if [[ -n ${__settings['
local sorter="sort ${__settings['sorting-options']} -k ${__settings['sorting-column']}"
fi
local
[[ ${__settings['hide-header']} == 'no' ]] && program="${program} header"
[[ (${__settings['underline-titles']} != 'no' && ${__settings['hide-header']} == 'no') && -n ${__settings['underline-titles-char']} ]] && program="${program} nline underlines"
[[ -n $sorter ]] && program="${program} sorted_lines" || program="${program} lines"
local -a arr_col_set
while read -d ';' || [[ -n $REPLY ]]; do
arr_col_set[$((counter++))]=$REPLY
done <<<"${__settings[col_set]}"
local line element column
for element in $program; do
counter=0
if [[ $element =~ (header|underlines) ]]; then
for column in "${arr_col_set[@]}"; do
wdth=${wdth:-${__settings['default-column-width']}}
align=$(echo -n "$column" | grep -oE "t:[rlc]" | grep -oE "[rlc]")
if [[ $align == r ]]; then
align='--right'
else
align='--left'
fi
if [[ $counter -eq 0 ]]; then
[[ $element == 'header' ]] &&
printf "%s%s" "$(__helper_line_drawer ' ' ${__settings['default-left-margin']})" "$(__helper_field_drawer $wdth "${__titles[$counter]}" ${align})" ||
printf "%s%s" "$(__helper_line_drawer ' ' ${__settings['default-left-margin']})" "$(__helper_line_drawer "${__settings['underline-titles-char']}" $wdth)"
else
[[ $element == 'header' ]] &&
printf "%s%s" "$(__helper_line_drawer ' ' ${__settings['default-width-between-columns']})" "$(__helper_field_drawer $wdth "${__titles[$counter]}" ${align})" ||
printf "%s%s" "$(__helper_line_drawer ' ' ${__settings['default-width-between-columns']})" "$(__helper_line_drawer "${__settings['underline-titles-char']}" $wdth)"
fi
: $((counter++))
done
elif [[ $element == 'sorted_lines' ]]; then
while IFS= read -r line <&4 || [[ -n $line ]]; do
wdth=$(echo -n "${arr_col_set[$counter]}" | grep -oE "w:[[:digit:]]+" | grep -oE "[[:digit:]]+")
align='--
align='--
line=${line
printf "%s%s" "$(__helper_line_drawer ' ' ${__settings['default-left-margin']})" "$(__helper_field_drawer $wdth "${line}" ${align})"
printf "%s%s" "$(__helper_line_drawer ' ' ${__settings['default-
: $((counter++))
done 4<&0 |
elif [[ $element ==
while IFS= read -r line <&4 || [[ -n $line ]]; do
while
IFS="${__settings['default-data-delim']:-$IFS}"
read -r line tail <<<"$tail"
[[ -n $line ]]
do
(($counter != 0)) || echo
wdth=$(echo -n "${arr_col_set[$counter]}" | grep -oE "w:[[:digit:]]+" | grep -oE "[[:digit:]]+")
wdth=${wdth:-${__settings['default-column-width']}}
align=$(echo -n "${arr_col_set[$counter]}" | grep -oE "a:[rlc]" | grep -oE "[rlc]")
if [[ $align == r ]]; then
align='--right'
elif [[ $align == c ]]; then
align='--center'
else
align='--left'
fi
line=${line#"${line%%[![:space:]]*}"}
line=${line%"${line##*[![:space:]]}"}
if [[ ${__settings['crop-to-width']} == 'yes' ]]; then
line=${line:0:$wdth}
fi
if [[ $counter -eq 0 ]]; then
printf "%s%s" "$(__helper_line_drawer ' ' ${__settings['default-left-margin']})" "$(__helper_field_drawer $wdth "${line}" ${align})"
else
printf "%s%s" "$(__helper_line_drawer ' ' ${__settings['default-width-between-columns']})" "$(__helper_field_drawer $wdth "${line}" ${align})"
fi
: $((counter++))
(($counter > ${#__titles[@]} - 1)) && {
counter=0
}
done
done 4<&0
echo
elif [[ $element == 'nline' ]]; then
echo
fi
done
return 0
}
</source>
|