我试图使用UNIX的进程id为SQL语句生成WHERE子句。
spid=$(ps -ef|grep "LOCAL=NO"|awk {'print $2'})
for (( i=0; i<${#spid[@]}; i++ ))
do
if [ ${i} -eq 0 ]; then
where="'${spid[$i]}'";
else
where=${where}", '${spid[$i]}'";
fi
done
echo $where
预期产出
'45674','4757','34535'
电流输出
'45674,4757,34535'
发布于 2014-01-03 22:27:27
您缺少了一组括号,因此分配给spid
的任务是创建单个字符串,而不是数组。使用:
spid=( $(ps -ef|grep "LOCAL=NO"|awk {'print $2'}) )
for (( i=0; i<${#spid[@]}; i++ ))
do
if [ ${i} -eq 0 ]; then
where="'${spid[$i]}'";
else
where=${where}", '${spid[$i]}'";
fi
done
echo $where
在技术上不需要空格的=( ... )
表示法定义了数组赋值。
我唯一不清楚的是嵌入的逗号是从哪里来的。您的预期输出应该包括一些空格,因为您的级联操作包含一个空格。
如果是我的代码,我会修复相当多的小间距和引用问题:
spid=( $(ps -ef | awk '/LOCAL=NO/ {print $2}') )
for (( i = 0; i < ${#spid[@]}; i++ ))
do
if [ ${i} -eq 0 ]; then
where="'${spid[$i]}'"
else
where="$where, '${spid[$i]}'"
fi
done
echo "$where"
或者,更有可能的是,我也会失去if
:
spid=( $(ps -ef | awk '/LOCAL=NO/ {print $2}') )
pad=""
for (( i = 0; i < ${#spid[@]}; i++ ))
do
where="$where$pad'${spid[$i]}'"
pad=", "
done
echo "$where"
或者让awk
生成所有输出:
ps -ef |
awk '/LOCAL=NO/ { printf("%s'\''%s'\''", pad, $2; pad=", "} END { printf "\n" }'
其中唯一的谜题是两次出现的'\''
序列;它是在单引号中嵌入单引号的规范方法。第一个单引号终止单引号字符串的当前段;反斜杠单引号嵌入一个单引号,另一个单引号开始单引号的下一个段。同样,还有其他方法可以做到这一点,但是使用双引号比使用单引号更困难。
https://stackoverflow.com/questions/20917242
复制相似问题