【发布时间】:2021-05-19 15:22:37
【问题描述】:
我有一个运行的 bash 脚本,我正在尝试使用 Perl 单行代码替换文件 variables.php 中的一些文本
但是,我想检查 Perl 单行程序是否成功运行,这就是我挂断电话的地方。我可以只输出单行,它会正常工作,但我想确定它是否运行。
基本上,函数 replace_variables() 是执行更新的函数,我想检查我的单行是否正常工作的 if 语句。
我尝试在该 if 语句中使用 run_command 函数,但不起作用,我尝试将单线直接放在那里,这也不起作用。
如果我不将其包装在 if 语句中,而只是直接调用单行代码,那么一切都会按预期进行。
这是完整文件
#!/bin/bash
export CLI_CWD="$PWD"
site_variables() {
if [ -f "$CLI_CWD/variables.php" ]; then
return true
else
return false
fi
}
replace_variables() {
# perl -pi -e 's/(dbuser)(\s+)=\s.*;$/\1 = Config::get("db")["user"];/; s/(dbpass)(\s+)=\s.*;$/\1 = Config::get("db")["pass"];/; s/(dbname)(\s+)=\s.*;$/\1 = Config::get("db")["database"];/' "$CLI_CWD/variables.php"
if [run_command ]; then
echo "Updated variables.php successfully"
else
echo "Did not update variables.php"
fi
}
run_command() {
perl -pi -e 's/(dbuser)(\s+)=\s.*;$/\1 = Config::get("db")["user"];/; s/(dbpass)(\s+)=\s.*;$/\1 = Config::get("db")["pass"];/; s/(dbname)(\s+)=\s.*;$/\1 = Config::get("db")["database"];/' "$CLI_CWD/variables.php"
}
if [ site_variables ]; then
replace_variables
else
>&2 echo "Current directory ($(pwd)) is not a project root directory"
exit 4
fi
这是 if 语句失败的函数
replace_variables() {
# perl -pi -e 's/(dbuser)(\s+)=\s.*;$/\1 = Config::get("db")["user"];/; s/(dbpass)(\s+)=\s.*;$/\1 = Config::get("db")["pass"];/; s/(dbname)(\s+)=\s.*;$/\1 = Config::get("db")["database"];/' "$CLI_CWD/variables.php"
if [run_command ]; then
echo "Updated variables.php successfully"
else
echo "Did not update variables.php"
fi
}
您可以看到我在 if 语句之前注释掉了单行,如果我让它运行并删除 if/else 检查,它就可以工作。
这里是更新前的原始文件sn-p
//Load from Settings DB
$dbuser = 'username';
$dbpass = 'password';
$dbname = 'database_name';
这里是更新后运行的文件 sn-p
//Load from Settings DB
$dbuser = Config::get("db")["user"];
$dbpass = Config::get("db")["pass"];
$dbname = Config::get("db")["database"];
【问题讨论】:
-
您可能会收到诸如
-bash: [run_command: command not found之类的错误,因为您在打开[后缺少一个空格 - 但正如答案所示,您根本不需要[ .. ]。 -
如果你确实得到了那个错误输出,那应该是问题的一部分,因为它比“它不起作用”更有帮助。
-
以编程方式修改代码可能是一项非常强大的技术,但对于普通情况,最好将所有内容都包含在源文件中并根据
#define选择要运行的代码(在语言中此类工具)或命令行参数或环境变量。