Вот некоторые альтернативы, похожие на ответ тердона , которые пытаются упростить обработку вывода SQL *Плюс, учитывая, что вы пытаетесь получить его в переменную оболочки ID_VAL
.
По умолчанию операторы SQL, выполняемые в SQL *Plus, создают форматированные отчеты, состоящие из столбцов, ширина которых зависит от соответствующих типов данных. Это приведет к некоторым возможным нежелательным эффектам :, например, к левым -дополненным числам, которые вы указали в комментарии .
Демонстрация:
$ DB_CONNECT="user/password@db"
$ ID_VAL="$(sqlplus -s $DB_CONNECT <<'END'
set feedback off
set head off
set pagesize 0
SELECT 123 FROM DUAL
/
END
)"
$ printf '"%s"\n' "$ID_VAL"
" 123"
$ printf '%s' "$ID_VAL" | od -An -tx1
20 20 20 20 20 20 20 31 32 33
Некоторые альтернативы:
Если вы выбираете число, преобразуйте его в строку и обрежьте в своем операторе SQL. Поскольку все остальное в приведенном выше скрипте не изменилось (, я продолжу использовать свой фиктивный оператор SELECT
для простоты тестирования ):
SELECT TRIM(TO_CHAR(123)) FROM DUAL;
Используйте dbms_output.put_line
в блоке PL/SQL:
ID_VAL="$(sqlplus -s $DB_CONNECT <<'END'
set serveroutput on
set feedback off
DECLARE
myvar NUMBER;
BEGIN
SELECT 123 INTO myvar FROM DUAL;
dbms_output.put_line(myvar);
END;
/
END
)"
Обратите внимание, что set serveroutput on
является обязательным, в противном случае вывод не отображается.
С помощью (1 )и (2 )вы получите:
$ printf '"%s"\n' "$ID_VAL"
"123"
$ printf '%s' "$ID_VAL" | od -An -tx1
31 32 33
Обратите внимание, однако, что эти подходы не сработают, если вы выбираете строку с пустыми символами по бокам, которые вы хотите сохранить (, например. foo
). Вы можете заключить эту строку в кавычки и удалить их впоследствии, или:
Разрешить SQL *Plus форматировать выходные данные как CSV:
ID_VAL="$(sqlplus -s -M "CSV ON" $DB_CONNECT <<'END'
set feedback off
set head off
SELECT ' foo ' FROM DUAL;
END
)"
printf '"%s"\n' "$ID_VAL"
"" foo ""
В отличие от чисел, строки заключаются в двойные -кавычки, что требует некоторой постобработки -. Предполагая, что возвращаемое значение не содержит
символов, одним из способов может быть использование sed
для удаления начального и конечного "
символов (все остальное без изменений):
ID_VAL="$(sqlplus -s -M "CSV ON" $DB_CONNECT <<'END' | sed 's/^"//; s/"$//;'
Лучший вариант зависит от вашего фактического варианта использования.
Я нашел решение. Это конфигурация служебного файла:
[Unit]
Description=Script that will execute my bin
[Service]
ExecStart=/home/nvidia/Desktop/daemonScripts/daemonVDM.sh
Environment="DISPLAY=:1"
Environment="XAUTHORITY=/run/user/1000/gdm/Xauthority"
RestartSec=30
Restart=always
[Install]
WantedBy=multi-user.target