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