コマンド名を変更して変数を使用する

コマンド名を変更して変数を使用する

renameこのコマンドを使用して、対話型スクリプトからユーザーが入力した文字に基づいてファイルのデフォルト名の文字を削除したいと思います。

基本的に私はこれをしたいと思います:

read characters_to_remove_inputted_by_the_user

rename 's/$characters_to_remove_inputted_by_the_user//g' file

しかし、変数を正しく挿入し、スクリプトの実行中にコマンド構造を維持するのに問題があります。

答え1

コマンドラインでわかるように、次のことを想定してください。perlrename実装(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

そしてutil-linux rename:

$ 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
$ 

関連情報