Varying Vagrant Vagrants配置脚本​​问题

时间:2017-12-26 12:30:12

标签: bash shell vagrant vvv-wordpress

我正在尝试为Browscap编写一个配置脚本,我几乎就在那里,我只是想在尝试重写php.ini文件时看到我做错了什么。

回购是here

配置脚本如下所示

#!/usr/bin/env bash

# Prettyfiers
BLUE='\033[0;36m'
NC='\033[0m' # No Color

DIR=`dirname $0`

echo "${BLUE}Setting up Browsecap${NC}"

# Check PHP version
PHP_VER=`php -r \@phpinfo\(\)\; | grep 'PHP Version' -m 1 | grep -Po -m 1 '(\d+\.\d+)' | head -1`
MIN_REQ="5.3"

if (( $(echo "${PHP_VER} < ${MIN_REQ}" |bc -l) )); then
  echo "${BLUE}The PHP version is lower than 5.3 so browscap won't work. Please upgrade your PHP version to higher than 5.3${NC}"
  exit 0
fi
echo "${BLUE}PHP version is${NC}" ${PHP_VER}

BROWSE_INI="/etc/php/${PHP_VER}/mods-available/php_browscap.ini"

# Check if browscap is already installed/set up
if [[ -f "${BROWSE_INI}" ]]; then
  echo "${BLUE}Browscap is already installed${NC}"
else
  # Set the browscap.ini and the php extension
  touch "${BROWSE_INI}"
  cp "php_browscap.ini" "${BROWSE_INI}"
  echo "${BLUE}Browscap copied${NC}"
fi

PHP_INI="/etc/php/${PHP_VER}/fpm/php.ini"

# Check if php.ini exists before replacing
if [[ -f "${PHP_INI}" ]]; then
  echo "${BLUE}php.ini exists${NC}"
  # Check if the default value exists - by default it should be ;browscap = extra/browscap.ini
  # If it doesn't then find browscap = and replace it with the correct one
  if [ "$(grep -qe ";browscap" "${PHP_INI}")" ]; then
    sudo sed -i "s|;browscap =|browscap = /etc/php/${PHP_VER}/mods-available/php_browscap.ini|g" "/etc/php/${PHP_VER}/fpm/php.ini"
  else
    sudo sed -i "s|browscap =|browscap = /etc/php/${PHP_VER}/mods-available/php_browscap.ini|g" "/etc/php/${PHP_VER}/fpm/php.ini"
  fi
  echo "${BLUE}php.ini changed${NC}"
else
  echo "${BLUE}php.ini doesn't exist${NC}"
fi

当条款结束时,我会检查我的php.ini

[browscap]
; http://php.net/browscap
;browscap = /etc/php/7.0/mods-available/php_browscap.ini /etc/php/7.0/mods-available/php_browscap.ini extra/browscap.ini

所以我在sed命令中遗漏了一些东西。

但是什么?

MVE

如果您安装了VVV,可以使用vagrant ssh

来嘘声

然后转到/home/vagrant并创建text.txttest.sh

text.txt

[browscap]
;browscap = extra/browscap.ini

test.sh

#!/usr/bin/env bash

TEST_FILE="/home/vagrant/text.txt"

# Check if php.ini exists before replacing
if [[ -f "${TEST_FILE}" ]]; then
  echo "text.txt exists"
  # Check if the default value exists - by default it should be ;browscap = extra/browscap.ini
  # If it doesn't then find browscap = and replace it with the correct one
  if grep -q ";browscap" "${TEST_FILE}"; then
    sudo sed -i "s|;browscap =|browscap = /etc/php/7.0/mods-available/php_browscap.ini|g" "${TEST_FILE}"
  else
    sudo sed -i "s|browscap =|browscap = /etc/php/7.0/mods-available/php_browscap.ini|g" "${TEST_FILE}"
  fi
  echo "text.txt changed"
else
  echo "text.txt doesn't exist"
fi

这将导致text.txt

[browscap]
browscap = /etc/php/7.0/mods-available/php_browscap.ini extra/browscap.ini

2 个答案:

答案 0 :(得分:1)

重写此声明

if [ "$(grep -qe ";browscap" "${PHP_INI}")" ]; then

if grep -q ";browscap" "${PHP_INI}"; then

因为您可以在shell条件中直接使用grep的返回码。原因是在前一种情况下,您错误地检查grep的返回代码以查看它是否成功,因为退出代码由shell处理。

(或)或者你也可以

grep -qe ";browscap" "${PHP_INI}"
rc=$?  

if [ $rc -eq 0 ]; then
    echo 'match found'
fi

因为如果grep找到了某些东西(零),那么sed会返回不同的退出代码,如果它没有找到某些东西(非零)。在if语句中,零退出代码映射到&#34; true&#34;并且非零退出代码映射为false。

此外,您的=语句应包含sed -i "s|;browscap =.*|browscap = /etc/php/${PHP_VER}/mods-available/php_browscap.ini|g" "/etc/php/${PHP_VER}/fpm/php.ini" 之后需要完成的匹配部分

{{1}}

答案 1 :(得分:1)

根据您发布的MCVE,您应该替换此代码块:

if grep -q ";browscap" "${TEST_FILE}"; then
  sudo sed -i "s|;browscap =|browscap = /etc/php/7.0/mods-available/php_browscap.ini|g" "${TEST_FILE}"
else
  sudo sed -i "s|browscap =|browscap = /etc/php/7.0/mods-available/php_browscap.ini|g" "${TEST_FILE}"
fi

只有一行:

sudo sed -i 's|;?browscap =.*|browscap = /etc/php/7.0/mods-available/php_browscap.ini|' "${TEST_FILE}"
相关问题