字符串测试中的子字符串在 unix shell 中产生用于测试的空变量

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

我已经很好地阅读了How do you tell if a string contains another string in Unix shell scripting?,但我正在努力让我的代码以此为例。

我在默认的 FreeBSD shell /bin/sh 中这样做。没有 bash 请回答。

这是我的代码

while
        : ${start=$i}
        var1="$(command | awk -v awk_i=$i  'NR==awk_i { print  }')" 
                if test ${var1#*$var2} = $var2
                then
                        row=$i
                        break
                fi
        i="$(( $i+1 ))"
        [ "$i" -lt $iterate ]
do :;
done

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

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

+ awk -v 'awk_i=27' 'NR==awk_i { print  }'
+ 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  }'
+ 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  }'
+ var1=file/path/variable
+ test file/path/variable '=' var2
+ i=30
+ [ 30 -lt 52 ]

我什至尝试过这种替代方法: ##*/ use in UNIX Shell Scripting

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

任何人都可以提出任何建议,为什么变量最终为空,因此正确输入的测试失败?是 / 会造成破坏吗? (虽然其他输出似乎都很好)

谢谢

可能这样的事情可能会有所帮助:

#!/bin/sh

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

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