多变量定义和赋值

时间:2014-06-29 19:29:36

标签: linux bash

我有一段脚本,基本上计算当前目录中目录使用的空间量,但我想帮助理解一些语法和语言礼仪。

这是脚本:

#!/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 ..为什么它们被单独定义为开始与?

1 个答案:

答案 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.