Вы упускаете набор скобок, поэтому присваивание 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" }'
Единственная головоломка-пи ece внутри есть последовательность '\''
, которая появляется дважды; это канонический способ вставки отдельной кавычки в одну строку с кавычками. Первая одиночная кавычка завершает текущий сегмент строки с одной кавычкой; обратная косая черта вставляет одну цитату, а другая одиночная кавычка запускает следующий сегмент одиночной кавычки. Опять же, есть другие способы сделать это, но использование двойных кавычек сложнее, чем использование одиночных кавычек.
+1 Также стоит отметить, что есть некоторые проблемы с цитированием. Например, это было бы лучше: 'spid = ($ (ps -ef | awk '/ LOCAL = NO/{print $ 2}'))' – Steve