如何在shell脚本中的变量中取空白值?

如何在shell脚本中的变量中取空白值?

我在命令中使用了 2 个变量grep来在文件中进行搜索。用户只输入一个并在第二个变量上按 Enter 键,就会引发错误。

如果用户没有为第二个变量输入任何内容,我想在变量第二个上设置空值。

#!/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 节 - 分词

shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分词。 [...] 显式空参数(“”””或“''”)被保留。由于扩展没有值的参数而产生的不带引号的隐式空参数将被删除。如果没有值的参数在双引号内展开,则会产生空参数并被保留。

相关内容