2016-11-04 14 views
1

私はbashスクリプティングには新しく、私は宿題スクリプトでアイデアを使い果たしました。bashスクリプト - スクリプトパラメータ内の空白を無視する

スクリプトはpathToDirectory、[-c/-m/-r] ==コピー/移動/削除ext1とext2の4つの引数をとります(スクリプトの実行例:script.sh/home/user/somefolder- c a.txt b.sh)。

スクリプトは、名前に 'a.txt'を含む/ home/user/someFolder(およびそのすべてのサブフォルダ)内のすべてのファイルを検索する必要があります(-cおよび-mの場合) partに 'b.sh'を指定し、-c/-m引数に応じて新しいファイルを作成するか、既存のファイルの名前を変更する(-rの場合はファイルを削除するだけです)、 'old name =>新しい名前'。上記のスクリプトの

出力例:
/home/user/someFolder/bbb.txt => /home/user/someFolder/bba.txt

まあ、それは実装する問題ではありませんでした、私のコードを私たちのアップロードシステムに投稿する(私たちのスクリプトを評価する)まで、すべてはうまくいった。

私のスクリプトを実行する最初のアップロードシステムの試みは、 "script.sh/something/graph 1 -c .jpg .jpeg"のように見えます。

'/ something/graph 1'全体がパスであり、 '1'の前の空白がすべてそれを破壊するという問題があります。

予想される出力:./projekty/graph 1.jpg => ./projekty/graph 1.jpeg
私のスクリプトの出力:./projekty/graph => ./projekty/graph.jpeg 1.jpg => 1.jpeg私はこれまで持って

if [ "$2" = "-r" ]; then 
    for file in $(find $1 -name "*$3"); do 
     echo $file 
     rm -f $file 
    done  

elif [ "$2" = "-c" ]; then 
    for file in $(find "$1" -name "*$3") ; do  
     cp "$file" "${file//$3/$4}" 
     echo $file "=>" ${file%$3}$4    
    done 

elif [ "$2" = "-m" ]; then 
    for file in $(find $1 -name "*$3"); do 
     mv "$file" "${file//$3/$4}" 
     echo $file "=>" ${file%$3}$4   
    done  

else  
    echo Unknown parameter >&2 
fi 

私が試した& notworking & probablystupidアイデア:として-r/-c/-mパラメータは$ 2でなければなりません。$ 2が何か他のもの(パスに属するものと仮定して)を検出し、その$ 2を$ 1に追加することができました。シフトを使用して、すべてのパラメータを左に移動しました(空白のため、-r/-m/-cパラメータは$ 2ではなく$ 3だったので、$ 2にしました)。 -c一部)私は「$ DIR」をエコーするとき

DIR=$1 
if [ "$2" != "-r" ] && [ "$2" != "-c" ] && [ "$2" != "-m" ]; then 
    DIR+=" $2" 
    shift  
fi 

if [ "$2" = "-c" ]; then 
    for file in $(find "$DIR" -name "*$3") ; do   
     cp "$file" "${file//$3/$4}" 
     echo $file "=>" ${file%$3}$4    
    done  
fi 

が、それは全体のパス(正しく)を示したが、それはまだ動作しませんでした... は、修正するためにどのように他の/より良い/どのような方法がありますこれはどうですか? :/

ありがとうございます!

答えて

1
  1. ターゲット文字列は、ファイル名の最後にのみ交換する必要があるとして、"${file//$3/$4}"は悪い考えです。

    例:./projekty/graph.jpg.jpg.jpg.graph.jpg

  2. ループに引用符で囲まれていない展開になりやすい文字列を渡すはないか良いアイデアです。

    ./projekty/graph 1.jpg 
    

    しかし、それは間違って展開され、ループ内:この問題を回避するには

    ./projekty/graph 
    1.jpg 
    

    、あなたが出力を保存することができます

    事実はfind期待どおりに動作し、その出力がどのように見えるということですfindを変数に追加し、テキストが残らなくなるまでトークン化します。

    list="$(find $1 -name "*$3")" 
    
    while [ -n "$list" ]; do 
        file="${list%%$'\n'*}" 
        list="${list#$file}" 
        list="${list#$'\n'}" 
        # your commands here 
        # ... 
    done 
    
関連する問題