Bash

如何呼叫帶有萬用字元模式和另外兩個參數的腳本?

  • November 17, 2016

我有這個程式碼來重命名一堆文件:

#!/bin/bash
for file in $1
   do
       mv -i "${file}" "${file/pattern/replacement}"
   done

如何將“模式”和“替換”替換為 $ 2 and $ 3?

此程式碼不起作用:

#!/bin/bash
for file in $1
   do
       mv -i "${file}" "${file/$2/$3}"
   done

我正在嘗試使用以下 3 個參數重命名:(file_*.jpg jpg bak結果應該是將所有*.jpg文件重命名為*.bak文件)。但它所做的只是:(mv -i file_01.jpg file_01.jpg因此不重命名任何東西,因為兩個 mv 參數是相同的,而且它在第一個文件處停止,即使有更多*.jpg文件)。如果我手動輸入jpgbak輸入 bash 腳本,而不是$2然後$3它確實可以工作。

你呼叫你的腳本

./script file_*.jpg jpg bak

但是*在傳遞給腳本之前會被擴展。假設您有文件file_1.jpgfile_2.jpg並且file_3.jpg在您的文件夾中,這就是呼叫的內容:

./script file_1.jpg file_2.jpg file_3.jpg jpg bak

這意味著${1} = file_1.jpg${2} = file_2.jpg${3} = file_3.jpg

如果您編寫腳本可能會更好,例如(在您的範例中):${1} = jpg${2} = bak. 然後你可以將這些變數儲存在你的腳本中,呼叫shift 2以擺脫它們,並簡單地通過使用循環所有位置參數

for file; do
   # do something
done

引用自:https://unix.stackexchange.com/questions/323676