
AIX 6.1では、文字列「FULL_RUN_SCRIPT_DIR」をすべて「/etc/rc.d/..」と同じパスに置き換えようとします。
これはコードです
SEE_FILE_PATH="$INIT_DIR$SERVICE_NAME"
FULL_RUN_SCRIPT_DIR="FULL_RUN_SCRIPT_DIR"
SERVICE_FILE="$INIT_DIR$SERVICE_NAME"
echo "String1:$FULL_RUN_SCRIPT_DIR"
echo "String2:$SEE_FILE_PATH"
echo "String3:$SERVICE_FILE"
perl -p -i -e "s/$FULL_RUN_SCRIPT_DIR/$SEE_FILE_PATH/g" "$SERVICE_FILE"
しかし、エラーが発生します。
String1:FULL_RUN_SCRIPT_DIR
String2:/etc/rc.d/init.d/seelinkdeployer
String3:/etc/rc.d/init.d/seelinkdeployer
Bareword found where operator expected at -e line 1, near "s/FULL_RUN_SCRIPT_DIR//etc"
syntax error at -e line 1, near "s/FULL_RUN_SCRIPT_DIR//etc"
Execution of -e aborted due to compilation errors.
どんなアイデアがありますか?
答え1
何かが間違っているという最初のヒントは、次のような場合です。
...
near "s/FULL_RUN_SCRIPT_DIR//etc"
...次のような表現が必要なとき
...
near "s/FULL_RUN_SCRIPT_DIR//etc/rc.d/init.d/seelinkdeployer/g"
...全体の価値があります$SEE_FILE_PATH
。
問題は、Perl演算子で/
検索テキストとs//
代替テキストを区別するためにスラッシュを使用しており、少なくとも代替テキストにスラッシュがあることです。
いくつかのオプションがあります。
でスラッシュを区切り文字として使用しないでください
s//
。検索テキストを使用するか、テキストにない内容を置き換えます。たとえば、~
:perl -p -i -e "s~$FULL_RUN_SCRIPT_DIR~$SEE_FILE_PATH~g" "$SERVICE_FILE"
検索および/または代替テキストでエスケープされたスラッシュをスラッシュに置き換えます(
//
パラメータ拡張がbashに似たシェルを使用していると仮定)。SEE_FILE_PATH=/etc/rc.d/init.d/seelinkdeployer SEE_FILE_PATH=${SEE_FILE_PATH//\//\\/}
追加資料: