Как я могу передать значение с $ в программу, запускаемую через su? - PullRequest
0 голосов
/ 17 февраля 2020

Мне нужно запустить один из скриптов, как показано ниже:

su - oracle - c 'cd / tmp / somepath; sh -x myscript. sh arg1 arg2 arg3 obj $ _jghd $: jhdbcdj: hshab sh '

где arg4 (obj $ _jghd $: jhdbcdj: hshab sh) должен быть обработанным как один аргумент и вызывая l oop в myscript. sh Ниже приведен пример кода

id1=$1
id2=$2
id3=$3
name=$4
S_Object=`echo ""${name}""|sed 's/:/ /g'`

здесь я переформатирую agr4 и удаляю разделитель: с пробелом и пытаюсь обнулить $ , Но при запуске скрипта не сохраняются все переменные, содержащие $ и получающие эту ошибку:

+ name='obj$:jhdbcdj:hshabsh'
++ echo 'obj$:jhdbcdj:hshabsh'
++ sed 's/:/ /g'
++ sed '/s/$/$/g'
sed: -e expression #1, char 4: unknown command: `$'

Не могли бы вы помочь получить правильную строку, хранящуюся в переменной name .

Я хочу, чтобы результат был таким:

echo $S_Object

S_Object='obj$_jghd$ jhdbcdj hshabsh'

, но я получаю как показано ниже:

echo $S_Object
S_Object='obj$ jhdbcdj hshabsh'

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

К сожалению, вам нужно исправить код, который запускает ваш скрипт - переменная name уже повреждена до запуска скрипта, потому что оболочка, которую вызывает su, заменяет $_jghd пустой строкой перед вызывается явный сценарий sh -x.

Для создания кода, содержащего данные, используйте printf %q, как указано ниже:

#!/usr/bin/env bash
value='obj$_jghd$:jhdbcdj:hshabsh'
printf -v cmd '%q ' sh -x myscript.sh arg1 arg2 arg3 "$value"
su - oracle -c "cd /tmp/somepath && $cmd"

Обратите внимание на использование bash, not sh, поскольку printf %q отсутствует в базовых оболочках POSIX, и, кроме того, не гарантируется генерация POSIX-совместимого вывода. (Следовательно, для обеспечения надежности всех возможных значений пользователь oracle должен быть настроен с bash в качестве оболочки).


В качестве альтернативы, вы можете передавать значения через среду:

#!/bin/sh
value='obj$_jghd$:jhdbcdj:hshabsh'
value="$value" su - oracle -c 'cd /tmp/somepath && ./myscript.sh arg1 arg2 arg3 "$value"'

Переназначение value в той же строке, что и su, помещает его в окружение su, которое затем наследуется оболочкой, впоследствии расширяющейся $value.

0 голосов
/ 18 февраля 2020

Измените вторую команду sed на sed 's/$ /$_/g', тогда вы должны получить желаемый результат.

0 голосов
/ 17 февраля 2020

Я исправил синтаксические ошибки и устаревшие идиомы в вашем скрипте.

Кажется, это работает:

#!/bin/bash

id1=$1
id2=$2
id3=$3
name=$4
S_Object=$( echo "${name}" | sed 's/:/ /g' | sed 's/$/\$/g'  )

echo "$S_Object"

Пожалуйста, дайте мне знать, если это поможет!

...