更完整的应用程序
经过长时间的中断,我们将恢复我们的工作 系统信息页面 程序。 我们的下一个添加将向程序添加几个命令行选项,如下所示:
● 输出文件。 我们将添加一个选项来指定包含程序输出的文件的名称。 它将被指定为 -f 文件 or - 文件 文件.
● 交互模式。 此选项将提示用户输入输出文件名,并确定指定的文件是否已存在。 如果是,则会在覆盖现有文件之前提示用户。 此选项将由以下任一者指定 -i or - 交互的.
● 救命。 或 -h or - 帮帮我 可以指定使程序输出信息性使用消息。
下面是实现命令行处理所需的代码:
用法 () {
echo "$PROGNAME: 用法:$PROGNAME [-f 文件 | -i]" 返回
}
# 处理命令行选项交互=
用法 () {
echo "$PROGNAME: 用法:$PROGNAME [-f 文件 | -i]" 返回
}
# 处理命令行选项交互=
文件名=
而 [[ -n $1 ]]; do case $1 in
-f | - 文件)
转移
文件名=$1
;;
文件名=
而 [[ -n $1 ]]; do case $1 in
-f | - 文件)
-i | --interactive) 交互=1
;;
-h | --help) 用法退出
;;
*) 用法 >&2
退出1
;;
-i | --interactive) 交互=1
;;
-h | --help) 用法退出
;;
*) 用法 >&2
退出1
;;
ESAC
转移完成
ESAC
转移完成
首先,我们添加一个名为的shell函数 用法 在调用帮助选项或尝试未知选项时显示消息。
接下来,我们开始处理循环。 这个循环继续,而位置参数
$1 不为空。 在循环结束时,我们有一个移位命令来推进位置参数,以确保循环最终会终止。
在循环中,我们有一个 案件 检查当前位置参数以查看它是否与任何支持的选项匹配的语句。 如果找到支持的参数,则对其执行操作。 如果 founc 是未知选项,则会显示用法消息并且脚本会因错误而终止。
-f 参数以一种有趣的方式处理。 当检测到时,它会导致额外的 转移 发生,这会提高位置参数 $1 到提供给的文件名参数 -f 选项。
我们接下来添加代码来实现交互模式:
#交互模式
如果 [[ -n $interactive ]]; 然后虽然为真; 做
read -p "输入输出文件名:" filename if [[ -e $filename ]]; 然后
read -p "'$filename' 存在。覆盖?[y/n/q] > " case $REPLY in
Y|y) 休息
#交互模式
如果 [[ -n $interactive ]]; 然后虽然为真; 做
read -p "输入输出文件名:" filename if [[ -e $filename ]]; 然后
read -p "'$filename' 存在。覆盖?[y/n/q] > " case $REPLY in
Y|y) 休息
;;
Q|q) echo "程序终止。" 出口
;;
*) 继续
;;
ESAC
elif [[ -z $文件名]]; 然后继续
其他
打破
fi
完成
fi
;;
Q|q) echo "程序终止。" 出口
;;
*) 继续
;;
ESAC
elif [[ -z $文件名]]; 然后继续
其他
打破
fi
完成
fi
如果 互动 变量不为空,则开始无限循环,其中包含文件名提示和后续现有的文件处理代码。 如果所需的输出文件已经存在,系统会提示用户覆盖、选择另一个文件名或退出程序。 如果用户选择覆盖现有文件, 打破 执行以终止循环。 请注意如何 案件 语句仅检测用户是选择覆盖还是退出。 任何其他选择都会导致循环继续并再次提示用户。
为了实现输出文件名功能,我们必须首先将现有的页面编写代码转换为shell函数,原因稍后会变得清楚:
write_html_page () { cat <<- _EOF_
$TITLE
$TITLE
$时间戳
$(报告正常运行时间)
$(report_disk_space)
$(report_home_space)
_EOF_返回
}
# 输出html页面
如果 [[ -n $filename ]]; 然后
write_html_page () { cat <<- _EOF_
$TITLE
$TITLE
$时间戳
$(报告正常运行时间)
$(report_disk_space)
$(report_home_space)
_EOF_返回
}
# 输出html页面
如果 [[ -n $filename ]]; 然后
如果触摸 $filename && [[ -f $filename ]]; 然后 write_html_page > $filename
其他
echo "$PROGNAME: 无法写入文件 '$filename'" >&2 exit 1
其他
写_html_页面
fi
如果触摸 $filename && [[ -f $filename ]]; 然后 write_html_page > $filename
其他
echo "$PROGNAME: 无法写入文件 '$filename'" >&2 exit 1
其他
写_html_页面
fi
处理逻辑的代码 -f 选项出现在上面显示的列表的末尾。 在其中,我们测试文件名是否存在,如果找到,则执行测试以查看文件是否确实可写。 为此,一个 触摸 执行,然后进行测试以确定生成的文件是否为常规文件。 这两个测试处理输入无效路径名的情况(触摸 将失败),并且,如果该文件已经存在,则它是一个常规文件。
如我们所见, 写_html_页面 调用函数来执行页面的实际生成。 它的输出要么被定向到标准输出(如果变量 文档名称 为空)或重定向到指定的文件。