2012-04-20 17 views
0

現在、このスクリプトは$ 1 $ 2用に設定されていますが、これは2つの入力を受け取り、1つは拡張子、1つはファイル名、相対パスが見つかると、そのファイルを新しい拡張子で置き換えます(同じ拡張子がない場合は何も行いません)。見つからなければ、エラーメッセージを出力します。私は必要なもの以前の入力で以前のプロセスを可能な入力数に適用するスクリプトを変更する

#!/bin/csh                  
set ext="$1" 
set oldName="$2" 
if (-r "$oldName") then 
set newName=`echo "$oldName" | sed 's/\.[A-Za-z0-9]*$/'".$ext"'/g'` 
if ("$oldName" == "$newName") then 
: 
else 
mv "$oldName" "$newName" 
endif 
else 
echo "$oldName": No such file 
endif 

はので、$ 1が常に拡張したものですが、$ 2は、例えば、可能な入力の任意の番号にすることができ、このスクリプトを変更することです:

./chExt.sh 'bat' 'bool.com' 'nofilefound.biz' 'james.bro' 

と本質的

になるだろう
bool.bat 
nofilefound.biz: No such file 
james.bat 

というように、常に拡張子として$ 1を読み、$ 2- $ nは元のスクリプトと同じプロセスを適用する必要があると見なします。

"foreach"と "shifts"を特に使用する必要があります。

+2

プログラミングは有害とみなされます! http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/を参照してください。もう1つのシェルを試してみてください。それは、 'python'や' perl'のようなスクリプト言語です。 – Gowtham

+1

最後の要件(「foreach」と「shift」を使用)は、これが宿題であることを意味します。スクリプト作成にcshを推奨する講座を受講する場合は、受講する指導の質を真剣に検討する必要があります。 cshはこのタイプのタスクには適していません。 –

答えて

0

Cシェルでは、$argv[2-]を使用してパラメータ2の配列などを取得できます。その配列をforeachループの:q修飾子と共にファイル名のスペースを処理するだけで済ませれば完了です。

#!/bin/csh 
set ext="$1" 

foreach oldName ($argv[2-]:q) 

    if (-r "$oldName") then 
     set newName=`echo "$oldName" | sed 's/\.[A-Za-z0-9]*$/'".$ext"'/g'` 
     if ("$oldName" == "$newName") then 
      : 
     else 
      mv "$oldName" "$newName" 
     endif 
    else 
     echo "$oldName": No such file 
    endif 

end 

そして、あなたはshiftforeachを使用したい場合は、ちょうど残りを通じて引数リストとループオフ最初のパラメータをノックするshiftを使用します。csh` `で

#!/bin/csh 
set ext="$1" 

shift 
foreach oldName ($argv) 

    set oldName = $1 
    if (-r "$oldName") then 
     set newName=`echo "$oldName" | sed 's/\.[A-Za-z0-9]*$/'".$ext"'/g'` 
     if ("$oldName" == "$newName") then 
      : 
     else 
      mv "$oldName" "$newName" 
     endif 
    else 
     echo "$oldName": No such file 
    endif 

end 
関連する問題