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

  1. if 是一个外壳功能
  2. 根据条件,它执行包含在then和之间的主体fi
  3. if检查的“条件”是一个命令
  4. 命令通常有一个返回/退出代码。通常
    • 0 为了成功
    • 1 (常见)和其他一切错误
      • 例如127找不到命令
  5. 当返回/退出代码为 0 时,执行主体
  6. 否则跳过;或控制被传递给elifelse
  7. 语法是 if <command>; then...

这是[ ]从哪里来的?

  1. test 是一个可以检查文件类型和比较值的命令
    • 参考man test和help test(仅限 bash)
  2. [ ... ] 是同义词 test
    • 注意括号应该在两边被空格包围
    • if [ -f "/path/to/$filename" ]; then
      • 例外:当由;不需要的新行或空格终止时
  3. test(或[ ]) 计算表达式并且不能执行其他命令或函数
  4. 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.

以上是Bash脚本中的Perl一行代码的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>