どのようにしてbashで関数入力のためのメタキャラクターを解析しますか


0

私は入力として*を取得するbashで関数を書きました。そのため、その特定のディレクトリ内のすべてのファイルをリストする必要があります。しかしそうではありません。 これが私が書いたものです:

    # a function that mass deletes files in a directory but asks before deleting
    yrm()
    {
    echo "The following files are going to be deleted:"
    ls "${1}"
    read -e -n 1 -p "Do you want to delete these files? Y/n" ANSWER
    ${ANSWER:="n"} 2> /dev/null 

    if [ $ANSWER == "Y" ]
        then
            rm $1
        else
            echo "aborted by user"

    fi

}

しかし、私はこれらのファイルでそれをテストしました:

l1zard@Marvin:~/.rclocal/test$ ls *
test1.txt  test2.txt  test3.txt  test5.txt  test7.txt  test8.txt  test9.txt  testm7m767.txt

そして私は私の関数からこの出力を得ます:

l1zard@Marvin:~/.rclocal/test$ yrm *
The following files are going to be deleted:
test1.txt
Do you want to delete these files? Y/nn
aborted by user

ファイルが正しく表示されるように修正するにはどうすればよいですか。

回答:


2

次のようにしてみてください。

ls "$@"
read ...
if [ "${ANSWER:=n}" = Y ]
then
  rm "$@"

しかし、ファイルが指定されているかどうか、そしてそれらが存在するかどうかもテストする必要があります。


ええ、それは$ @で動作します。ありがとう。
l1zard

また、私はfuntoionを少し短くすることができました:
l1zard

0

この関数はこのようになり、Scrutinizerのおかげで動作します。

# a function that mass deletes files in a directory but asks before realy delting those
yrm()
{
echo "The following files are going to be deleted:"
ls "$@"
rm -rI "$@"
}

1
これが答えである理由は、その関数が ではない 受け取る * パラメータとして:関数が呼び出される前にシェルはアスタリスクを展開します。を参照してください 拡張 bashマニュアルのセクション
glenn jackman

これはちょっと厄介ですが、私は$ @と$ *については知っていましたが、それを使うことを考えませんでした。あなたのご親切に感謝します。
l1zard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.