我正在尝试编写一段代码,使用内置环境变量将文件移动到 .junk 目录。我的目标是用户所要做的就是输入 sh junk filename1 filename2 filename3... 并且脚本将使用 $1、$2、$3... 来移动文件。不幸的是我无法让计数器循环正常工作。
#!/bin/s
if [ $# = 0 ]
then echo "Usage: junk -l | -p | { filename }*"
elif [ $1 = "-l" ] && [ $HOME/.junk ]
then ls $HOME/.junk
elif [ $1 = "-p" ] && [ $HOME/.junk ]
then rm -r $HOME/.junk
elif [ $1 = "$@" ] && [ $HOME/.junk ]
then echo $#
i=1
s="$"
while [ $i -le $# ]
do
echo $s$i
mv $s$i .junk/$i
i=$(($i+1))
done
fi
答案1
一些迫在眉睫的问题:
getopts
用于参数处理或有理由不使用。- 如果脚本给出了超过 1 个参数,则
"$@"
第三个参数elif
会将其炸毁。 - 使用
for f in "$@"
循环而不是while
循环。
为什么?
- 如果您输入
sh junk --help
...或一些更有趣的mv
选项,会发生什么? - 量子电动力学
- 更简单 => 更好
答案2
#!/bin/sh
junkdir="$HOME/.junk"
do_list=false
do_purge=false
while getopts 'lp' opt; do
case "$opt" in
l) do_list=true ;;
p) do_purge=true ;;
*)
printf 'Usage: %s [-l|-p] [ name ... ]\n' "$0" >&2
exit 1
esac
done
shift "$(( OPTIND - 1 ))"
if [ ! -d "$junkdir" ] && ! "$do_purge"; then
printf '%s: Missing junk directory "%s"\n' "$0" "$junkdir" >&2
printf '%s: Re-run with -p to create it\n' "$0" >&2
exit 1
fi
if "$do_list"; then
printf 'Current junk in "%s":\n' "$junkdir"
ls -l "$junkdir"
fi
if "$do_purge"; then
printf 'Emptying junk directory "%s"\n' "$junkdir"
rm -rf "$junkdir"
mkdir "$junkdir"
fi
if [ "$#" -eq 0 ]; then
exit
fi
echo 'Junking the following things:'
printf '%s\n' "$@"
mv "$@" "$junkdir"
该脚本实现了您想要做的事情。它用于getopts
解析命令行标志-l
和/或-p
.
我正在解析命令行选项的 while 循环中设置do_list
and ,因为我想控制and进一步向下发生do_purge
的顺序。如果用户使用或我希望他们查看垃圾目录的内容ls
rm
-lp
-pl
前它被删除。
删除垃圾目录也会-p
重新创建它。为了简单rm -rf
起见,我这样做了mkdir
。
在命令行解析循环之后,我调整位置参数,以便它们仅包含非选项参数(文件和/或目录的名称)。
如果没有位置参数($#
为零),我不会尝试运行mv
将文件移动到垃圾目录。