使用环境变量的计数器循环

使用环境变量的计数器循环

我正在尝试编写一段代码,使用内置环境变量将文件移动到 .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

一些迫在眉睫的问题:

  1. getopts用于参数处理或有理由不使用。
  2. 如果脚本给出了超过 1 个参数,则"$@"第三个参数elif会将其炸毁。
  3. 使用for f in "$@"循环而不是while循环。

为什么?

  1. 如果您输入sh junk --help...或一些更有趣的mv选项,会发生什么?
  2. 量子电动力学
  3. 更简单 => 更好

答案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_listand ,因为我想控制and进一步向下发生do_purge的顺序。如果用户使用或我希望他们查看垃圾目录的内容lsrm-lp-pl它被删除。

删除垃圾目录也会-p重新创建它。为了简单rm -rf起见,我这样做了mkdir

在命令行解析循环之后,我调整位置参数,以便它们仅包含非选项参数(文件和/或目录的名称)。

如果没有位置参数($#为零),我不会尝试运行mv将文件移动到垃圾目录。

相关内容