我有一段脚本,基本上计算当前目录中目录使用的空间量,但我想帮助理解一些语法和语言礼仪。
这是脚本:
#!/bin/bash
# This script prints a little histogram of how much space
# the directories in the current working directory use
error () {
echo "Error: $1"
exit $2
} >&2
# Create a tempfile (in a BSD- and Linux-friendly way)
my_mktemp () {
mktemp || mktemp -t hist
} 2> /dev/null
# check we are using bash 4
(( BASH_VERSINFO[0] < 4 )) && error "This script can only be run by bash 4 or higher" 1
# An array to keep all the file sizes
declare -A file_sizes
declare -r tempfile=$(my_mktemp) || error "Cannot create tempfile" 2
# How wide is the terminal?
declare -ir term_cols=$(tput cols)
# Longest file name, Largest file, total file size
declare -i max_name_len=0 max_size=0 total_size=0
# A function to draw a line
drawline () {
declare line=""
declare char="-"
for (( i=0; i<$1; ++i )); do
line="${line}${char}"
done
printf "%s" "$line"
}
# This reads the output from du into an array
# And calculates total size and maximum size, max filename length
read_filesizes () {
while read -r size name; do
file_sizes["$name"]="$size"
(( total_size += size ))
(( max_size < size )) && (( max_size=size ))
(( max_file_len < ${#name} )) && (( max_file_len=${#name} ))
done
}
# run du to get filesizes
# Using a temporary file for output from du
{ du -d 0 */ || du --max-depth 0 *; } 2>/dev/null > "$tempfile"
read_filesizes < "$tempfile"
# The length for each line and percentage for each file
declare -i length percentage
# How many columns may the lines take up?
declare -i cols="term_cols - max_file_len - 10"
for k in "${!file_sizes[@]}"; do
(( length=cols * file_sizes[$k] / max_size ))
(( percentage=100 * file_sizes[$k] / total_size ))
printf "%-${max_file_len}s | %3d%% | %s\n" "$k" "$percentage" $(drawline $length)
done
printf "%d Directories\n" "${#file_sizes[@]}"
printf "Total size: %d blocks\n" "$total_size"
# clean up
rm "$tempfile"
exit 0
在我以粗体突出显示的read_filesizes()
函数的第一行和第二行中,如果(size name)
被分配给name
,为什么要创建两个变量size
在阵列?
在同一个函数中,(( max_size < size )) && (( max_size=size ))
这一行对我来说似乎很奇怪,因为这两个表达式怎么能都是真的?
然后在for循环的第一行(( **length=cols** * file_sizes[$k] / max_size ))
我不明白为什么变量length
被分配给cols
..为什么它们被单独定义为开始与?
答案 0 :(得分:0)
虽然我不能100%确定语法,但似乎很清楚回答你的问题:
第一个问题
如果在数组中将名称分配给大小,为什么要创建两个变量(大小名称)?
看起来name
保存文件名,size
保存文件大小。然后赋值file_sizes["$name"]="$size"
存储由文件名索引的文件大小。
第二个问题
(( max_size < size )) && (( max_size=size ))
如果size
的先前值小于max_size
,我相信此行会将max_size
分配给size
。目标是在最后max_size
保持最大文件的大小。
第三个问题
(( length=cols * file_sizes[$k] / max_size ))
这计算将为每个文件显示的行的长度(其目标可能是说明文件与最大文件相比的相对大小)。该行的长度相对于文件的大小。 cols
是将为最大文件(大小为max_size
的文件)显示的行的长度。 cols
=终端的长度 - 最长文件名的长度 - 10.