當前位置 主頁 > 服務器問題 > Linux/apache問題 > 最大化 縮小

    處理Shell腳本中帶有空格的變量(bash腳本)

    欄目:Linux/apache問題 時間:2020-02-06 08:23

    本篇主要介紹bash腳本中對于含空格文件處理方式。

    在批量處理音頻文件時候使用下面的腳本發現含有空格的文件名并不能被處理;

    #$1: 遍歷的文件夾
    rootDir=$1
    cd $rootDir
    allAudioFile=$(find $1 -name "*\.mp3")
    for oneAudioFile in $allAudioFile
    do
      mv -f $oneAudioFile  $rootDir
    done

    通過set -x將執行信息打印出來,發現可以執行到,但是執行過程提示找不到對應的文件名,mv對應的source文件并不是原本的文件名,通過對比發現原來是文件名中含有空格,導致在for循環的過程中并沒有將完整的文件名取出來;

    例如有文件a b.mp3這時候在for循環的時候會有下面的打印:

    mv: cannot stat “./a” : No such file or directory

    從上面的錯誤信息可以發現原本的文件名由于空格被打斷了,因此需要在for循環處理的過程中識別到文件名是含有空格的,從而對文件名中的空格不做處理;

    bash使用IFS變量進行分割,所以需要修改IFS的分隔方式進而重新隔離,即需要將"\n"換行處理作為處理方式:

    IFS=$(echo -en “\n\b”)
    IFS=$(echo -en “\n\r”)

    上面的兩種方式均可(使用Ubuntu16.04),其它也可以,只需要在處理的時候將"\n"作為其中一個標識即可,因為使用find命令或者其他命令會將結果以行的形式存放到變量中;

    #$1: 遍歷的文件夾
    rootDir=$1
    cd $rootDir
    allAudioFile=$(find $1 -name "*\.mp3")
    IFS_BACKUP=$IFS
    IFS=$(echo -en "\n\b")
    #IFS=$(echo -en "\n\r")
    for oneAudioFile in $allAudioFile
    do
      mv -f "$oneAudioFile"  $rootDir
    done
    IFS=$IFS_BACKUP

    至此,bash腳本中對于含空格文件處理方式介紹完畢,當然要記得將原本的IFS內容保存下來,腳本跑完了將原本的內容放回去。

    總結

    以上所述是小編給大家介紹的處理Shell腳本中帶有空格的變量(bash腳本),希望對大家有所幫助!

    下一篇:沒有了
在线观看中文字幕理论片