扩展bash脚本以接收更多参数?

时间:2013-03-19 18:22:30

标签: bash shell parameters arguments

我有以下bash脚本,名为trash.sh。在我的脚本中,我从用户请求一个参数,只是一个文件名。并将文件移动到位于用户主目录中的“废纸篓”文件夹。如果目录不存在,它只创建一个,然后将文件移动到那里。另一方面,如果文件不存在,则通知用户。

#!/bin/bash

FILE=$1
FOLDER="$HOME/Trash"
ARGS=1

if [ $# -ne $ARGS ]
then
    echo "Error: You are missing an argument!"
    echo "Usage: ./trash.sh <file_name>"
else
    if [ -s $FILE ]
    then
        if [ -d $FOLDER ]
        then
            mv -v $FILE $FOLDER
        else
            mkdir $FOLDER
            mv -v $FILE $FOLDER
        fi
    else
        echo "The file you have entered does not exist!"
    fi
fi

现在,我想以跟随方式扩展我的脚本,但我不知道如何,因为我对bash脚本没有多少经验。首先,我想让用户输入多个参数,只需一个文件名,然后移动垃圾箱文件夹中的所有文件。如果一个或多个文件不存在,它将通知用户哪些文件不存在。简单地说,我希望我的脚本能够收到用户想要的参数。

例如,如果用户像这样调用脚本:

./trash.sh file1 file2 file3

让我们说file2不存在我想要输出。

file1 -> /home/user/Trash/file1
file3 -> /home/user/Trash/file3
file2 doesn't exist!

最后,我还希望它接受这样的参数:

./trash *.txt

简单地说,它会移动所有以.txt扩展名结尾的文件。如果有人可以帮助我实现这些目标/扩展我的脚本,我会很高兴。

1 个答案:

答案 0 :(得分:2)

[ $# = 0 ] && { echo "Usage: $0 file [...]" >&2; exit 1; }

FOLDER="$HOME/Trash"
mkdir -p "$FOLDER" || exit 1

for file in "$@"
do
    if [ -s "$file ]
    then mv -v "$file" "$FOLDER"
    else echo "$0: $file does not exist" >&2
    fi
done

您可以检测零参数并在循环之前发出用法消息。使用"$@"对于处理包含空格等的文件名至关重要;使用"$file"引用文件同上。如果目标目录已存在,则使用mkdir -p不会失败;如果无法创建目录或存在具有给定名称的文件(而不是目录),则会失败。请注意,错误消息都包含$0;请注意,“找不到文件”消息指定文件名。

正如评论中所讨论的,您可以分两步简化:

[ $# = 0 ] && { echo "Usage: $0 file [...]" >&2; exit 1; }

FOLDER="$HOME/Trash"
mkdir -p "$FOLDER" || exit 1

for file in "$@"
do  mv -v "$file" "$FOLDER"
done

然后:

[ $# = 0 ] && { echo "Usage: $0 file [...]" >&2; exit 1; }
FOLDER="$HOME/Trash"
mkdir -p "$FOLDER" || exit 1
mv -v "$@" "$FOLDER"

请注意,如果删除三个目录中的makefile,则只有其中一个将存在于“废纸篓”中。