Bash脚本中的Perl一行代码
我有一个运行的 bash 脚本,我正在尝试使用 Perl one-liner 来替换文件 variables.php 中的一些文本
但是,我想检查 Perl one-liner 是否成功运行,这就是我挂断电话的地方。我可以只输出 one-liner 并且它可以正常工作,但我想确定它是否运行。
基本上,函数 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 检查,它会起作用。
这是更新前的原始文件片段
//Load from Settings DB
$dbuser = 'username';
$dbpass = 'password';
$dbname = 'database_name';
这是更新运行后的文件片段
//Load from Settings DB
$dbuser = Config::get("db")["user"];
$dbpass = Config::get("db")["pass"];
$dbname = Config::get("db")["database"];
回答
tl;博士和解决方案
ifwith 的这种用法[ ]不会给你你期望的结果。
你在找什么
...
if run_command; then
...
更长的解释
基础知识 if
if是一个外壳功能- 根据条件,它执行包含在
then和之间的主体fi if检查的“条件”是一个命令- 命令通常有一个返回/退出代码。通常
0为了成功1(常见)和其他一切错误- 例如
127找不到命令
- 例如
- 当返回/退出代码为 0 时,执行主体
- 否则跳过;或控制被传递给
elif或else - 语法是
if <command>; then...
这是[ ]从哪里来的?
test是一个可以检查文件类型和比较值的命令- 参考man test和
help test(仅限 bash)
- 参考man test和
[ ... ]是同义词test- 注意括号应该在两边被空格包围
if [ -f "/path/to/$filename" ]; then- 例外:当由
;不需要的新行或空格终止时
- 例外:当由
test(或[ ]) 计算表达式并且不能执行其他命令或函数if [ expr ]; then是替代语法if test expr; then
PS:在与test或 一起使用时“引用”您的“$variables”的良好做法[ ]
PPS:[[ ... ]]完全不同。不是 POSIX;仅在某些 shell 中可用。看看UNIX Stack Exchange 上的这个线程
- thanks, that was way easy. If you can't tell, I'm new to Bash, that did the trick. Thank you.