我有一个 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