Shell-Script
使用帶有重命名命令的變數
我想使用該
rename
命令根據使用者在互動式腳本中輸入(輸入)的字元來刪除文件基名上的字元。基本上,我想這樣做:
read characters_to_remove_inputted_by_the_user rename 's/$characters_to_remove_inputted_by_the_user//g' file
但是我無法正確插入變數並在腳本執行期間保持命令結構。
假設 - 正如您自己的命令行所暗示的那樣 -
perl
的rename
實現(自 1989 年版本 3 以來附帶的範例腳本perl
,並且通常作為命令包含在許多作業系統中,有時作為與此包分開的擴展的perl
重寫) ,有時在某些 Linux 發行版上呼叫,否則來自,您可以使用以下環境:prename``rename
util-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}
或者,您可以使用
export
shell 特殊內置命令,以便在它執行的每個命令的環境中傳遞該 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/
)。