Ошибка unary operator expected
, вероятно, связана с тем, что $PIDofP
не заключен в кавычки в условии. В этом случае, когда $PIDofP
является пустой строкой, оболочка не видит никакого значения в левой части =
вместо пустого значения, отсюда и сообщение об ошибке.
Следующий фрагмент правильно реализует логику сравнения PID с помощью if
/elif
/else
, что гарантирует генерацию только одного из трех возможных выходов echo
. Он использует синтаксис сравнения POSIX (см. В чем разница между двойными и одинарными квадратными скобками в bash?).
#!/bin/sh
NAME=syslogd
PID=/var/run/$NAME.pid
PIDofP=`pidof $NAME`
if [ "$PIDofP" = "" ]; then
echo " No process is running."
elif [ "$PIDofP" -lt 1000 ]; then
echo " The PID number is lower than 1000. ($PID: $PIDofP)"
else
# $PIDofP is >= 1000.
echo " The PID number is 1000 or higher. ($PID: $PIDofP)"
fi
exit 0
jq имеет функцию соединения именно для этой ситуации:
jq '[.major,.minor,.hotfix] | map (tostring) | join(".")'
Вы можете опустить map
, если значения уже являются строками.
Используйте команды jq
в серии подстановок команд в назначении переменных, которые жестко -кодируют точку между ними:
output="$(jq.major...)"."$(jq.minor...)"."$(jq.hotfix...)"
jq -j '.major, ".",.minor, ".",.hotfix, "\n"' file
на случай, если кто-то не понял, вот что написано на справочной странице:
Even literals like "hello" or 42 are filters - they take an input but always produce the same literal as output.
....
, If two filters are separated by a comma, then the input will be fed into both and there will be multiple outputs: first, all of the outputs produced by the left expression, and then all of the outputs produced by the right.
Так что нет необходимости в каких-либо усложнениях типа | map | join
/ чего бы то ни было в таких простых случаях. Возможно, справочная страница должна быть лучше структурирована.