我正在编写一个shell脚本,用shell脚本中的perl替换与另一个整数的变量内容。
#!/bin/sh
InitialFileStep="$1"
CurrentStage=$((($i*(9*4000))+$InitialFileStep))
PreviousStage=$((($(($(($i-1))*(9*4000)))) + (InitialFileStep)))
perl -pi -e 's/$PreviousStage/$CurrentStage/g' file.txt
echo "Hey!"
似乎无法在文件中找到变量内容。 我不知道问题是什么,是因为变量是整数而不是字符串?
答案 0 :(得分:2)
变量只存在于shell脚本中;你不能在你的Perl脚本中直接使用它们。
我讨厌尝试从shell生成Perl代码,就像之前的解决方案所示。这就是疯狂所在(虽然它可以在这里工作,因为你只是处理整数)。相反,将值作为参数或其他方式传递。
perl -i -pe'BEGIN { $S = shift; $R = shift; } s/\Q$S/$R/g' \
"$PreviousStage" "$CurrentStage" file.txt
或
export PreviousStage
export CurrentStage
perl -i -pe's/\Q$ENV{PreviousStage}/$ENV{CurrentStage}/g' file.txt
或
S="$PreviousStage" R="$CurrentStage" perl -i -pe's/\Q$ENV{S}/$ENV{R}/g' file.txt
答案 1 :(得分:1)
shell不会解释单引号内的任何内容。 '$ThisIsASimpleStringForTheShell'
请尝试:
perl -pi -e 's/'"$PreviousStage"'/'"$CurrentStage"'/g' file.txt
双引号可以防止可能的空格搞乱您的命令。
混合单引号和双引号使您可以在命令中添加正则表达式运算符,从而防止shell在perl之前解释它们。仅当前者单独存在于一行中时,此命令才会将$PreviousStage
的内容替换为$CurrentStage
的内容:
perl -pi -e 's/^'"$PreviousStage"'$/'"$CurrentStage"'/g' file.txt