네 개의 변수를 생성하는 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]}
이 네 가지 조건부 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
명령 세트를 만드는 경향이 있습니다 (하나의 명령과 일부 파일 이름이 아님). 또한 변수는 작은따옴표로 확장되지 않으므로 큰따옴표를 사용하십시오. (참고: 문자열에서 큰따옴표를 바꾸면 이 문제가 해결될 것이라고 생각했지만 그렇지 않습니다. 실제로 파일에 큰따옴표를 추가해야 하는 경우 대신 이를 사용하십시오.)-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