我试图了解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
$ $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)
这似乎有些棘手。实际上它会打印foo,foo bar并且bar。由于awk中i未定义的值(它是bash变量),因此被认为是(我不知道这种行为,但是很有意义)。$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)