Shell-Script

使用帶有重命名命令的變數

  • March 26, 2017

我想使用該rename命令根據使用者在互動式腳本中輸入(輸入)的字元來刪除文件基名上的字元。

基本上,我想這樣做:

read characters_to_remove_inputted_by_the_user

rename 's/$characters_to_remove_inputted_by_the_user//g' file

但是我無法正確插入變數並在腳本執行期間保持命令結構。

假設 - 正如您自己的命令行所暗示的那樣 -perlrename實現(自 1989 年版本 3 以來附帶的範例腳本perl,並且通常作為命令包含在許多作業系統中,有時作為與此包分開的擴展perl重寫) ,有時在某些 Linux 發行版上呼叫,否則來自,您可以使用以下環境:prename``renameutil-linux

STRING=$characters_to_remove_inputted_by_the_user rename 's/\Q$ENV{STRING}\E//g' ./*

上面,$characters_to_remove_inputted_by_the_user shell變數的內容作為使用檢索的STRING 環境變數的值傳遞。perl``$ENV{STRING}

或者,您可以使用exportshell 特殊內置命令,以便在它執行的每個命令的環境中傳遞該 shell 變數,包括rename

export characters_to_remove_inputted_by_the_user
rename 's/\Q$ENV{characters_to_remove_inputted_by_the_user}\E//g' ./*

\Q/是為了\E確保$STRING被視為固定字元串而不是正則表達式。如果您希望將其視為正則表達式,那就是:

REGEXP=$characters_to_remove_inputted_by_the_user rename 's/$ENV{REGEXP}//g' ./*

避免這樣的事情:

重命名“s/$characters_to_remove_inputted_by_the_user//g”./*

上面的 shell 變數的內容在呼叫之前由 shell 擴展rename,因此這可能構成命令注入漏洞,因為變數的值將被解釋為perl程式碼(例如,考慮類似的值//;system("reboot");s/)。

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