0

ディレクトリが書き込み可能でないかどうかをテストする場合、この関数は常にTrueを返します。誰か私に理由を説明してもらえますか? 失敗しているのは、「ディレクトリは書き込み可能ですか」(これまでのところ) だけです。しかし、何が起こっているのかを事前に詳しく説明するために、関数全体を含めたいと思いました。

この関数は、「前」および「後」の文字列を受け入れて、すべてのスペースをダッシュ​​に置き換えてファイルやディレクトリの名前を変更します。「名前変更」機能を使用するつもりでしたが、事前に作成されたスケルトン スクリプトに従う必要がありました。

更新されたスクリプト:

    my_rename()
    {
        echo "Trying: myrename $1 $2"

        # implement this function to my_rename $1 to $2
        # The following error checking must happen:

        # 1. check if the directory where $1 resided is writeable, if not then report an error
        # Is it a directory or a file
        if [ -d $1 ]
        then
            dnam=$1
            ftyp=$"dir"
        else
            # It's a file. Let's get the dirname
            dnam=$(dirname $1)\"
            ftyp=$"file"
        fi

        echo "dnam $dnam"

        # Is the directory writable
        errcd=0
        if [ ! -w "$dnam" ]
        then
            # Not writable. Show an error.
            echo "Directory $dnam is not writable by $(whoami)"
            errcd=1
        fi

        # 2. check if "$2" exists -if it does report and error and don't do the mv command
        if [ "$errcd" -eq 0 ] && ([ -f $2 ] || [ -d $2 ])
        then
            if [ $ftyp = "file" ]
            then
                echo "File $2 already exists"
            else
                echo "Directory $2 already exists"
            fi
            errcd=1
        fi

        # 3. check the status of the mv command and report any errors
        if [ "$errcd" -eq 0 -a -e $2 ]
        then
            exec "mv -f $1 $2"
            if [ $? -gt 0 ]
            then
                echo "Command failed: myrename $1 $2"
            fi
        fi
    }


    bryan@bryan-VirtualBox:~/renametest$ ./script3.sh -f ~/renametest
    Trying: myrename "/home/bryan/renametest/1 2" "/home/bryan/renametest/1-2"
    dnam "/home/bryan/renametest"
    Directory "/home/bryan/renametest" is not writable by bryan

    drwxr-xr-x  3 bryan bryan  4096 2013-04-03 17:10 renametest
4

1 に答える 1

0

コメントを回答としてマークする機能のリクエストは引き続き拒否されるため、上記のソリューションをここにコピーします。

Re: -w 問題、上流を見てください。最初の引数がディレクトリである場合は dnam が設定されていますが、ディレクトリではないか存在しない場合は、次のようにします: dnam=$(dirname $1)\"あなたが示す出力サンプルは編集されているか、エスケープされた " が示唆するように、値の一部として引用符を付けてこれらの値を関数に渡しました. system do not include quotes. この問題は、関数内ではなく、この関数を呼び出す時点にあるようです. – William

于 2014-06-18T06:24:34.687 に答える