Bashで複数の条件付きsedコマンドを結合する方法は?

Bashで複数の条件付きsedコマンドを結合する方法は?

4つの変数を生成するbashダイアログボックスがあります。各個別変数 -空でない場合- sedコマンドが同じファイルで実行されるようにします。

var1、var2、var3、およびvar4変数の4つの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]}

これら4つの条件付き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フィルタリングに単一のコマンドを使用している場合(シェル条件は必要ありません)、次の簡単なトリックを使用できます。

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ご覧のとおり、各代替コマンドの逆方向アドレスを追加しました。空の場合にのみ/^${var1}/一致します(または行のセミコロン以下で構成されます)。値が渡された場合にのみコマンドが実行されるように一致をvar1反転します。!svar

答え2

私はオプションを使用してコマンドがすべてコマンドであることを示すsedコマンドセットを作成する傾向があります(1つのコマンドと一部のファイル名ではありません)。また、変数は一重引用符で拡張されないため、二重引用符を使用してください。 (注:文字列で二重引用符を置き換えると、この問題は解決されると思いましたが、そうではありません。実際にファイルに二重引用符を追加する必要がある場合は、代わりにそれを使用してください。)-esed\"

だからこんな感じ:

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

関連情報