在awk打印中将bash用于循环变量

ada*_*dam 2 bash awk

我试图了解bash和awk中的特定情况:

我想使用awk 二进制运算符在两个变量(一个空格)之间进行字符串串联,因为$i在bash for循环中迭代了变量:

$ for i in ' '; do 
  echo "foo bar" | awk '{print $1$i$2}'
done
foofoo barbar
Run Code Online (Sandbox Code Playgroud)

预期输出为: foobar

问题1

  • 到底是怎么回事?回答(标记为正确)

问题2

  • 我如何像上述bash for loop中那样使用awk来使用字符串连接?回答

参考

$ $SHELL --version | head -n1
GNU bash, version 4.3.42(4)-release (x86_64-unknown-cygwin)

$ awk --version | head -n1
GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.3, GNU MP 6.1.0)
Run Code Online (Sandbox Code Playgroud)

全面测试

$ for i in '+' '-' '*' '/' '%' ' ' ''; do echo "2.0 4.0" | awk '{print $1$i$2}'; done
2.02.0 4.04.0
2.02.0 4.04.0
2.02.0 4.04.0
2.02.0 4.04.0
2.02.0 4.04.0
2.02.0 4.04.0
2.02.0 4.04.0
Run Code Online (Sandbox Code Playgroud)

Tru*_*ueY 5

这似乎有些棘手。实际上它会打印foofoo bar并且bar。由于i未定义的值(它是变量),因此被认为是(我不知道这种行为,但是很有意义)。$0

更改代码为

for i in ' '; do 
  echo "foo bar" | awk '{print $1"<"$i">"$2}'
done
Run Code Online (Sandbox Code Playgroud)

输出:

foo<foo bar>bar
Run Code Online (Sandbox Code Playgroud)

如果要传递变量的值,i可以使用-v参数。但$i由于的值i不应为数字$i,因此将不起作用,因此只需使用simple即可i

for i in ' '; do
  echo "foo bar" | awk -v i="$i" '{print $1"<"i">"$2}'
done
Run Code Online (Sandbox Code Playgroud)

输出:

foo< >bar
Run Code Online (Sandbox Code Playgroud)