0

我目前将此脚本设置为 $1 $2,它接受两个输入,一个是扩展名,一个是文件名,并在相对路径中搜索文件名,如果找到,则用新扩展名替换文件(或者如果相同的扩展名),如果未找到,则打印错误消息。

#!/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”。

4

1 回答 1

0

在 C-Shell 中,您可以$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

如果您想使用shiftand foreach,只需使用 将shift第一个参数从参数列表中剔除并循环遍历其余参数:

#!/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
于 2013-08-21T19:43:38.867 回答