我有以下 bash 脚本:
#!/bin/bash
OUTPUT=NULL,2,3,NULL,5,6,7,8
pvar1=$(echo $OUTPUT | awk -F ',' '{print $1}')
pvar2=$(echo $OUTPUT | awk -F ',' '{print $2}')
pvar3=$(echo $OUTPUT | awk -F ',' '{print $3}')
pvar4=$(echo $OUTPUT | awk -F ',' '{print $4}')
pvar5=$(echo $OUTPUT | awk -F ',' '{print $5}')
pvar6=$(echo $OUTPUT | awk -F ',' '{print $6}')
pvar7=$(echo $OUTPUT | awk -F ',' '{print $7}')
pvar8=$(echo $OUTPUT | awk -F ',' '{print $8}')
for i in {$pvar1..$pvar8}
do
case "$i" in
"NULL")
pOUT="$(awk '{ $* = $* }1' FS=, OFS=, <<<"$OUTPUT")"
;;
"")
echo "particulars field is not allowed to be empty. Run the program again and enter NULL or choose a value!" && exit 0
;;
*)
pOUT="$(awk '{ $* = q $* q }1' FS=, OFS=, q="'" <<<"$OUTPUT")"
;;
esac
done
echo "$pOUT"
输出应该是:
pOUT=NULL,'2','3',NULL,'5','6','7','8'
如果没有提供值,脚本应该退出,例如:
OUTPUT=NULL,2,3,NULL,5,6,,8
我不确定如何在 for 循环中编写 awk 命令。有人可以帮忙吗?
运行 awk 来拆分一个(!)字段或连接字符是浪费且不必要的;shell 可以很好地做到这一点。目前尚不清楚您想要什么,因为您的某些代码根本没有意义,但根据您的单个示例,这应该很接近:
但是如果您确实想使用 awk 它可以轻松地一次完成整个工作
甚至更简单,perl:
不知道您要在这里实现什么,但是循环中的 awk 可能不是出了什么问题。
会给你
这可能不是你想要的。
一个选项是:
或多或少的行为与您描述的一样。除了
awk
,您还可以查看cut
,但这取决于您对脚本的进一步处理。{$pvar1..$pvar8}
不按预期工作。代替填充
pvar1
等pvar2
,将信息存储在位置参数中:然后很容易迭代。例子:
此外,您还
$#
可以免费获得字段数 ( )。代码是可移植的。不过有一个缺陷。Unset
IFS
不等于空IFS
。变量将被设置后IFS="$old_IFS"
,即使原始变量未设置。希望您知道IFS
整个脚本应该使用什么,以便您可以调整代码。添加一些逻辑来测试相关变量是否在将其值分配给另一个变量之前被设置也是一种可能性。在 Bash 中,您可以通过使用命名数组变量来避免覆盖原始位置参数数组。
在您的循环中,如果
awk
命令正在工作,pOUT=…
则会将某些内容分配给变量而不保存已经完成的内容;以前pOUT
的不使用。这意味着最终pOUT
将仅来自最后一次迭代。我认为您不想pOUT
依赖 ; 的最终字段OUTPUT
。您希望 的每个部分都pOUT
依赖于OUTPUT
.pOUT
按顺序构建:请注意,此方法会生成一个前导
,
。pOUT
在循环之后,我们用${pOUT#,}
.