linux - Getopts 选项仅在执行函数时回显
问题描述
我正在创建一个名为“remove”的命令,它的功能基本上与 rm 命令相同,但不是实际删除文件,而是将它们存储到回收站文件夹中。
我正在研究“删除”命令的选项,并且在使用 -v 选项时遇到了一些困难。-v 选项应该具有与 rm 命令相同的功能;它会回显一条消息,指出该文件已被删除。
我的脚本如下所示:
flag=0
mainprocess(){
for filename in $*
mv $filename ~/deleted/$(basename $filename)"_"$(stat -c%i $filename)
flag=1
done
脚本的 getopts 部分如下所示
while getopts v opt
do
shift
case $opt in
v)
for file in $*
do
if [ $flag -eq 1 ]
then
echo "The file $file has been deleted"
fi
done
;;
esac
if [ $flag -eq 0 ]
then
mainprocess $*
fi
我对 -v 选项的处理方法是,一旦 mainprocess 函数运行,它将标志变量设置为 1,然后它会回显文件已被删除的消息。每当我使用 -v 选项运行命令时,“文件已被删除”消息永远不会回显。我也尝试显示标志变量的值,即使我运行 mainprocess 命令,它也始终为 0。
解决方案
无需添加代码来告诉用户正在做什么,只需使用 mv 本身的 -v 选项即可。像这样的东西:
VERBOSE=
while getopts v opt
do
shift
case $opt in
v) VERBOSE=-v ;;
esac
done
for filename in $*
do
mv $VERBOSE $filename '~/deleted/$(basename $filename)"_"$(stat -c%i $filename)'
done
推荐阅读
- scala - 错误未从用户代码中捕获抛出:火花流中的 java.lang.IllegalStateException
- angular - 单击提交按钮两次发送请求,Angular 7
- java - 使用 Spock 在 Java 中存根或模拟静态方法
- vue.js - 我无法在 Vuejs 中运行开发服务器
- azure - 无效的请求。请求格式错误或无效。从 Azure 获取访问令牌时
- postgresql - 在没有选择器的情况下访问包装在服务中的外部数据库资源
- powerbi - 一种基于时间标记变化的度量
- javascript - 在 Windows 10 上的 IE 页面中在 Edge 中打开窗口
- python-3.x - 如果文件不存在则下载并使用 Flask 发送
- android - GetChildView 在折叠和展开 ExpandableListView 时得到刷新