如何在 bash 中组合多个条件 sed 命令?

如何在 bash 中组合多个条件 sed 命令?

我有一个 bash 对话框,可以生成四个变量。每个单独的变量 -如果不为空- 将导致在同一文件上执行 sed 命令。

生成四个变量 var1、var2、var3、var4 的 Bash 对话框脚本

#!/usr/bin/env bash   
response=$(dialog               \
        --title "ini configure"     \
        --form  "Configure php.ini" \
          15 50 0                   \
        "Execution Time:"       1 1    "$exe_time"     1 10 20 0      \
        "Memory Limit:"         2 1    "$mem_limit"    2 10 20 0      \
        "Max File Size:"        3 1    "$max_file"     3 10 20 0      \
        "Max Post Size:"        4 1    "$max_post"     4 10 20 0      \  
        3>&1 1>&2 2>&3 3>&-)
    
    responsearray=($response)
    
    var1=${responsearray[0]} 
    var2=${responsearray[1]} 
    var3=${responsearray[2]} 
    var4=${responsearray[3]}

如何组合这四个条件 sed 命令?

if [[ -n "$var1" ]]; then   
    sed -i 's/^;*\max_execution_time = .*/max_execution_time = "${var1}"/' /user/php8.0-fpm/php.ini
    
if [[ -n "$var2" ]]; then   
    sed -i 's/^;*\memory_limit = .*/memory_limit = "${var2}"/' /user/php8.0-fpm/php.ini 

if [[ -n "$var3" ]]; then   
    sed -i 's/^;*\max_file_size = .*/max_file_size = "${var3}"/' /user/php8.0-fpm/php.ini
    
if [[ -n "$var4" ]]; then   
    sed -i 's/^;*\max_post_size = .*/max_post_size = "${var4}"/' /user/php8.0-fpm/php.ini

我知道我可以将多个 sed 命令与分号组合起来,但造成问题的是条件。

操作系统:Ubuntu 20.04 无头

答案1

您已经接受了另一个答案,但是如果您最初的想法是使用单个sed命令进行过滤(不需要 shell 条件),您可以使用一个简单的技巧,例如:

sed -i "/^${var1}/!s/^;*\(max_execution_time = \).*/\1${var1}/
        /^${var2}/!s/^;*\(memory_limit = \).*/\1${var2}/
        /^${var3}/!s/^;*\(max_file_size = \).*/\1${var3}/
        /^${var4}/!s/^;*\(max_post_size = \).*/\1${var4}/" /user/php8.0-fpm/php.ini

s如您所见,我为每个ubstitute 命令添加了一个反转地址。仅当为空(或由少于或等于该行的分号组成)/^${var1}/时才匹配。var1反转!匹配,因此仅当携带值s时才执行该命令。var

答案2

我倾向于创建一组sed命令,使用-e选项来告诉sed它们都是命令(不是一个命令和一些文件名)。另外,变量不会用单引号扩展,因此请使用双引号。 (注意:我假设替换字符串中的双引号应该可以解决此问题,但事实并非如此。如果实际上应该将双引号添加到文件中,请\"改为使用。)

所以像这样:

sedCommands=()
if [[ -n "$var1" ]]; then   
    sedCommands+=(-e "s/^;*\max_execution_time = .*/max_execution_time = ${var1}/")
fi
    
if [[ -n "$var2" ]]; then   
    sedCommands+=(-e "s/^;*\memory_limit = .*/memory_limit = ${var2}/")
fi

if [[ -n "$var3" ]]; then   
    sedCommands+=(-e "s/^;*\max_file_size = .*/max_file_size = ${var3}/")
fi
    
if [[ -n "$var4" ]]; then   
    sedCommands+=(-e "s/^;*\max_post_size = .*/max_post_size = ${var4}/")
fi

if [[ ${#sedCommands[@]} -gt 0 ]]; then
    sed -i "${sedCommands[@]}" /user/php8.0-fpm/php.ini
else
    echo "No changes made." >&2
fi

相关内容