쉘 스크립트에서 변수에 빈 값을 얻는 방법은 무엇입니까? [폐쇄]

쉘 스크립트에서 변수에 빈 값을 얻는 방법은 무엇입니까? [폐쇄]

grep파일을 검색하기 위해 명령에 2개의 변수를 사용했습니다 . 사용자가 하나를 입력하고 두 번째 변수에서 Enter 키를 누르면 오류가 발생합니다.

사용자가 두 번째 변수에 대해 아무것도 입력하지 않으면 두 번째 변수에 null 값을 설정하고 싶습니다.

#!/bin/bash 
find /var/log/nginx/ -type f ( -iname "access.log*" ! -iname "access.log*.gz" ) -exec cat {} + >> output.txt 
echo enter the file name read file1 
echo "enter varible 1" 
read var1 
echo "enter varible 2" 
read var2 
grep -w $var1 output.txt | grep $var2 | cut -d' ' -f1,4,12,25 > $file1 
grep -w $var1 output.txt | grep $var2 |sed 's#.*(aff_id=[[:digit:]]\+).*(off_id=[[:digit:]]‌​\+).*(trans_‌​id=[[:alnum:]]\+)‌​;.*#\1 \2 \3#' > out2.txt 
paste -d' ' $file1 out2.txt > out3.txt 
rm -rf output.txt 
rm -rf $file1

답변1

당신이 찾고 있는 것은 변수에 값이 할당되었는지 테스트하는 기능인 것 같습니다. 이는 Bash 문자열 비교 연산자를 사용하여 수행할 수 있습니다. 이러한 연산자는 다음과 같은 여러 가지 공통 참조에 문서화되어 있습니다.

특히 다음 을 사용하여 if [ -n "${string}" ]비어 있지 않은 문자열을 테스트 할 수 있습니다. 이 테스트를 사용하도록 스크립트를 조정하면 다음과 유사한 결과가 나타날 수 있습니다.

#!/bin/bash
find /var/log/nginx/ -type f ( -iname "access.log*" ! -iname "access.log*.gz" ) -exec cat {} + >> output.txt
echo enter the file name read file1
echo "enter varible 1"
read var1
echo "enter varible 2"
read var2

if [[ -n "${var2}" ]]; then var2=""; fi

grep -w $var1 output.txt | grep $var2 | cut -d' ' -f1,4,12,25 > $file1
grep -w $var1 output.txt | grep $var2 | sed 's#.*(aff_id=[[:digit:]]\+).*(off_id=[[:digit:]]‌​\+).*(trans_‌​id=[[:alnum:]]\+)‌​;.*#\1 \2 \3#' > out2.txt

paste -d' ' $file1 out2.txt > out3.txt
rm -rf output.txt
rm -rf $file1

즉, 이것이 문제 해결에 도움이 될 것이라고 생각하지 않습니다. 오류를 방지하려면 grep변수를 인용하는 것으로 충분합니다(예: ) grep -w "${var1}" output.txt. 인용된 변수를 사용하는 스크립트는 다음과 같습니다.

#!/bin/bash
find /var/log/nginx/ -type f ( -iname "access.log*" ! -iname "access.log*.gz" ) -exec cat {} + >> output.txt
echo enter the file name read file1
echo "enter varible 1"
read var1
echo "enter varible 2"
read var2

if [[ -n "${var2}" ]];
    var2=""
fi

grep -w "${var1}" output.txt | grep "${var2}" | cut -d' ' -f1,4,12,25 > $file1
grep -w "${var1}" output.txt | grep "${var2}" | sed 's#.*(aff_id=[[:digit:]]\+).*(off_id=[[:digit:]]‌​\+).*(trans_‌​id=[[:alnum:]]\+)‌​;.*#\1 \2 \3#' > out2.txt

paste -d' ' $file1 out2.txt > out3.txt
rm -rf output.txt
rm -rf $file1

grep표현식에서 변수를 참조해야 하는 이유 에 대한 설명은 다음에서 찾을 수 있습니다.Bash 초보자 가이드: 섹션 3.4.8 - 토큰화:

쉘은 단어 분할을 위해 큰따옴표 안에 표시되지 않는 인수 확장, 명령 대체 및 산술 확장의 결과를 스캔합니다. [...] 명시적인 null 인수("""" 또는 "''")는 유지됩니다. 값이 없는 매개변수 확장으로 인해 암시적으로 인용되지 않은 null 매개변수는 제거됩니다. 값이 없는 매개변수를 큰따옴표로 확장하면 빈 매개변수가 생성되고 유지됩니다.

관련 정보