2013-05-21 42 views
0

因此,腳本應該採用文件擴展名和可能的多個文件來更改擴展名。它適用於大多數情況,但是當文件中有一個空格時,它會更改它,然後說文件不存在。繼承人我有...Bourne Shell腳本正在做這項工作,但會產生額外的信息

#!/bin/sh 
fileExtension="$1" 
shift 
oldName="[email protected]" 
extension=${oldName##*.} 
totalFiles=$# 
totalFiles=$((totalFiles+1)) 

num=1 
while [ $num -lt $totalFiles ] 
do 
    for i in "$oldName" 
    do 
     extension=${i##*.} 
     if test -e "$i" then 
      newName="${i%.*}.$fileExtension" 
      if [ "$i" = "$newName" ] 
      then 
      : 
      else 
       mv "$i" "$newName" 
      fi 
     else 
      echo "$i": No such file 
     fi 
     num=$((num+1)) 
     shift 
     done 
done 

回答

0

你不能迭代字符串,至少不是你的方式。 oldName需要是一個數組

# other stuff 
oldName=("[email protected]") 
# other stuff 
for i in "${oldName[@]}" 
# other stuff 
+0

嘛,試圖將其更改爲未工作,它只是造成了大量的錯誤。 – Monkeybutt

+0

爲什麼不只是'爲了我'$ @「'(甚至是'我',儘管我個人從來沒有在腳本中寫過這些,但它的意思是一樣的)?然後,您也可以避免循環體中的「移位」。 –

0

爲什麼不把它簡化:

#!/bin/sh 
fileExtension="$1" 
shift 
for file in "[email protected]" 
do 
    extension=${file##*.} 
    if [ -e "$file" ] 
    then 
     newName="${file%.*}.$fileExtension" 
     if [ "$file" != "$newName" ] 
     then mv "$file" "$newName" 
     fi 
    else 
     echo "$file: No such file" >&2 
    fi 
done 
+0

所以,你是對的,我應該簡化它,但它仍然讀取一個文件,中間有一個空格作爲兩個不同的文件。我認爲擴展部分會照顧到,但顯然不是。 – Monkeybutt

+0

由於顯示的腳本讀取了命令行參數,因此問題可能是「您如何調用腳本?」如果腳本是「testscript」,那麼運行'testscript *'應該將每個文件名作爲單獨的參數傳遞,即使文件名包含空格也是如此。顯示的代碼將正常工作。另一方面,如果你有另一個腳本調用它,並且它的文件名列表沒有被正確構造(也許另一個腳本包含'testscript $ *'而不是正確的'testscript'$ @「'),那麼你結束包含空格被破壞的文件名。 –

+0

我會考慮編寫'extension =「$ {file ## *。}」',因爲我對可能包含空格的變量非常謹慎。然而,其中一些可以追溯到80年代初在(原始)Bourne shell上的學習,並且我被告知這不是必需的。但是,這是唯一沒有得到充分保護的線路。您可以使用'sh -x testscript'運行腳本,或者在腳本的頂部添加'set -x'來查看shell是如何解釋腳本的。 –

0

我這個懂了......

#!/bin/sh 
fileExtension="$1" 
shift 
for file in "[email protected]" 
do 
    if test -e "$file" 
    then 
    newName="${file%.*}.$fileExtension" 
     if test "$file" = "$newName" 
     then 
     : 
     else 
      mv "$file" "${file%.*}.$fileExtension" 
    fi 
    else 
     echo "$file": No such file >&2 
    fi 
done