1

私は、trash.sh と呼ばれる次の bash スクリプトを持っています。私のスクリプトでは、ユーザーに 1 つのパラメーター (単純にファイル名) を要求します。そして、ファイルをユーザーのホーム ディレクトリにある Trash フォルダーに移動します。ディレクトリが存在しない場合は、ディレクトリを作成し、そこにファイルを移動します。一方、ファイルが存在しない場合は、ユーザーに通知します。

#!/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 フォルダーに移動させたいと考えています。1 つ以上のファイルが存在しない場合は、存在しないファイルがユーザーに通知されます。簡単に言えば、スクリプトがユーザーが望むだけ多くのパラメーターを受け取るようにしたいのです。

たとえば、ユーザーが次のようにスクリプトを呼び出した場合:

./trash.sh file1 file2 file3

そして、file2が存在しないとしましょう。出力が必要です。

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

最後に、次のようなパラメーターを受け入れることも必要です。

./trash *.txt

簡単に言うと、.txt 拡張子で終わるすべてのファイルを移動します。誰かがこれらのことを達成したり、スクリプトを拡張したりするのを手伝ってくれたらうれしいです。

4

1 に答える 1

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;が含まれていることに注意してください。「ファイルが見つかりません」というメッセージがファイル名を示していることに注意してください。

コメントで説明されているように、これを 2 つの手順で簡略化できます。

[ $# = 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"

3 つのディレクトリにあるメイクファイルを削除すると、そのうちの 1 つだけがゴミ箱に入ることに注意してください。

于 2013-03-19T18:25:52.453 に答える