rename
このコマンドを使用して、対話型スクリプトからユーザーが入力した文字に基づいてファイルのデフォルト名の文字を削除したいと思います。
基本的に私はこれをしたいと思います:
read characters_to_remove_inputted_by_the_user
rename 's/$characters_to_remove_inputted_by_the_user//g' file
しかし、変数を正しく挿入し、スクリプトの実行中にコマンド構造を維持するのに問題があります。
答え1
コマンドラインでわかるように、次のことを想定してください。perl
rename
実装(1989年バージョン3以降、含まれているサンプルスクリプトはperl
通常、多くのオペレーティングシステムにコマンドとして含まれているか、時にはパッケージとは別の拡張書き換えとして含まれます)perl
。これ)、prename
一部のLinuxディストリビューションでは時々呼び出されます。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
シェル値として渡された変数STRING
環境perl
検索された変数を使用してください$ENV{STRING}
。
export
または、以下を含む、実行するすべてのコマンドの環境にシェル変数を渡すシェル特殊組み込み機能を使用できます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" の名前を変更します。/*
上記のシェル変数の内容は呼び出される前にシェルによって拡張されるため、変数の値がコード(たとえば、このような値)rename
として解釈されるため、これはコマンドインジェクションの脆弱性に対応する可能性があります。perl
//;system("reboot");s/
答え2
$ touch myfile1
$ ll
total 0
-rw-rw-r--. 1 fpm fpm 0 Mar 25 15:30 myfile1
$ read DELCHARS
my
$ rename -- "$DELCHARS" "" myfile1
$ ll
total 0
-rw-rw-r--. 1 fpm fpm 0 Mar 25 15:30 file1
$