字符串测试中的子字符串在unix shell中为测试生成空变量

substring in string test yields empty variable for test in unix shell

我很了解如何在Unix shell脚本中判断一个字符串是否包含另一个字符串?但是我正在努力让我的代码作为一个例子来处理这个问题。

我在默认的freebsd shell/bin/sh中执行此操作。请不要使用bash答案。

这是我的密码

1
2
3
4
5
6
7
8
9
10
11
12
while
        : ${start=$i}
        var1="$(command | awk -v awk_i=$i  'NR==awk_i { print $1 }')"
                if test ${var1#*$var2} = $var2
                then
                        row=$i
                        break
                fi
        i="$(( $i+1 ))"
        ["$i" -lt $iterate ]
do :;
done

我知道var1工作正常,因为测试失败,并继续迭代整个系列直到结束。问题是,当测试应该通过时,var1的变量是空的。

下面是一些调试输出,我们在其中进行了迭代,找到了var2的正确值,理论上通过了测试,然后由于变量没有正确地表示为测试的一部分,所以它继续运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
+ awk -v 'awk_i=27' 'NR==awk_i { print $1 }'
+ var1=file/path/variable
+ test file/path/variable '=' var2
+ i=28
+ [ 28 -lt 52 ]
+ :
+ : 2
+ command
+ awk -v 'awk_i=28' 'NR==awk_i { print $1 }'
+ var1=file/path/variable
+ test '=' var2
test: =: unexpected operator
+ i=29
+ [ 29 -lt 52 ]
+ :
+ : 2
+ command
+ awk -v 'awk_i=29' 'NR==awk_i { print $1 }'
+ var1=file/path/variable
+ test file/path/variable '=' var2
+ i=30
+ [ 30 -lt 52 ]

我甚至尝试过这种替代方法:##*/在Unix Shell脚本中使用

1
if ${var1##*/$var2} = $var2

是否有人能提出任何建议,为什么变量以空白结尾,从而导致测试无法正确输入?是不是可能造成大破坏?(尽管其他输出看起来不错)

谢谢


这样可能有帮助:

1
2
3
4
5
6
7
8
#!/bin/sh

zfs list | while read -r line; do
        var1=$(echo $line | awk '{print $1'})
        echo ${var1}
        # your logic here
        # ...
done

在这个基本脚本中,命令zfs list(在每个交互中)只使用一次,而不是多次调用,后者的输出用于形成/创建变量和自定义条件。