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