我正在尝试使用UNIX中的Process 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'
答案 0 :(得分:3)
您缺少一组括号,因此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" }'
唯一的拼图是'\''
序列出现两次;这是在单引号字符串中嵌入单引号的规范方法。第一个单引号终止单引号字符串的当前段;反斜杠单引号嵌入单引号,另一单引号启动单引号字符串的下一段。同样,还有其他方法可以做到这一点,但使用双引号比使用单引号更难。