当我运行以下单行代码时,我会在 PuTTY 中得到运行输出,如下所示:(
在\
下面添加以使其更易于阅读,实际的单行脚本中不包含该内容)
fileName=10M.csv ; \
for k in {1..3}; do for i in {1..1}; do for j in {blue,red,yellow}; do \
working=`cat "$fileName" | \
awk -v i=$i -v j=$j -v k=$k -F',' '{ if ( $1 == j && $2 == i && $3 == k ) print $1","$2","$3","$4","$13","$14}'`; \
nJ=${j:0:1}; \
nJ=${nJ^^}; \
echo "$i $j $nJ $k"; \
new="$i""_""$nJ""_""$k""_.txt"; \
echo $new; \
echo $working; \
done; done; done
working=
但是,如果我通过删除第3 行的部分 [不计算空白行] 和相应的“记号”来简化脚本,我会得到很好的输出,这样就cat
可以按预期执行;直到它被封装在working
变量中时,CSV 表才会在echo
-ed 时运行:
fileName=10M.csv ; \
for k in {1..3}; do for i in {1..1}; do for j in {blue,red,yellow}; do \
cat "$fileName" | \
awk -v i=$i -v j=$j -v k=$k -F',' '{ if ( $1 == j && $2 == i && $3 == k ) print $1","$2","$3","$4","$13","$14}'; \
nJ=${j:0:1}; \
nJ=${nJ^^}; \
echo "$i $j $nJ $k"; \
new="$i""_""$nJ""_""$k""_.txt"; \
echo $new; \
done; done; done
我的脚本在 PuTTY 中生成运行输出时出了什么问题?
- 我猜这
awk
与awk
.
您在扩展时忘记了双引号
$working
(即在您的echo
命令中),因此它会受到分词的影响;而不是整个值是'echo'的单个参数,每个空格分隔的单词都成为一个单独的参数,原始分隔符丢失,因为echo
总是使用单个空格连接接收到的参数:`cmd`
, 以及$(cmd)
所有其他扩展,但是您的反引号使用恰好是豁免的,因为它是变量赋值的一部分 - 即在var=`cmd`
技术上可以不加引号的特定情况,但将其更改为var="`cmd`"
,甚至var="$(cmd)"
,不会伤害并可能会提高理解。