Je dois exécuter l'un des script comme ci-dessous:
su - Oracle -C 'CD / TMP / SOITPATH; sh -x myscript.sh arg1 arg2 arg3 OBJ $ _JGHD $: JHDBCDJ: HSHABSH ' P> BlockQuote>
Où Arg4 (OBJ $ _JGHD $: JHDBCDJ: HSHABSH) doit être traité comme un argument et appelez-vous en boucle dans myscript.shsh Vous trouverez ci-dessous le code d'exemple P>
echo $S_Object S_Object='obj$ jhdbcdj hshabsh'
3 Réponses :
J'ai corrigé les erreurs de syntaxe et les idiomes obsolètes de votre script.
Ceci semble fonctionner: p> S'il vous plaît laissez-moi savoir s'il aide! P > p>
Cela n'a pas beaucoup aidé. S_Object = 'obj $ jhdbcdj hshabsh'
J'ai supprimé SED 'S / $ / \ $ / g' semble que $ pasappe n'est pas nécessaire
toujours, la chaîne complète ne vient pas après $ signe
Vous n'expliquez pas ce que devrait i> viennent après le $ code>, alors comment est-ce que quelqu'un est que vous êtes censé savoir si une réponse est correcte?
avec myscript.sh j'ai passé obj $ £ £ € $ alors autre chaîne avec: Saperated. Mais obtenir obj $ donc _jghd $ est ignoré après le premier $
Malheureusement, vous devrez corriger le code qui démarrait votre script - la variable code> nom code> est déjà corrompu avant le démarrage du script, car la coque que Pour générer du code contenant des données, utilisez Notez l'utilisation de bash, pas em> Alternativement, vous pouvez transmettre des valeurs via l'environnement: p> réaffectation su code> invoque remplace
$ _ jggd code> avec une chaîne vide avant que le script explicite
sh -x code> est appelé.
printf% q code>, comme suit: p>
sh code>, comme
printf% q code> n'est pas présent dans les coquilles de base de POSIX et n'est en outre garantie de générer une sortie compatible POSIX. (Par conséquent, pour que cela soit fiable avec toutes les valeurs possibles, l'utilisateur
oracle code> doit être configuré avec
bash code> comme coquille). P>
valeur code> sur la même ligne que
su code> le met dans
SU code> de l'environnement, qui est ensuite hérité par le shell en expansinant ultérieurement
$ valeur code>. p> p>
En fait, SU - Oracle -C sera ajouté dans l'outil que je ne peux pas supprimer. afin qu'il ait besoin de courir comme su - oracle -c 'sh myscript.sh arg1 arg2 arg3 "Valeur $" J'ai essayé "$ valeur", mais cela n'a pas non plus fonctionné.
Signaler un bogue à cet autre auteurs de l'outil. Ce qu'ils font ne sont pas seulement traitant des données de manière non contrainte, il s'agit également d'une préoccupation de sécurité puisqu'elle évalue les données comme s'il s'agissait de CODE.
su - oracle -c 'sh myscript.sh "obj $ €: JHDBCDJ: HSHABSHJ"' obj $ jhdbcdj hshabsh tellement au-dessus de la sortie que je reçois mais il devrait être obj € JHDBCDJ HSHABSH
Si votre coquille extérieure est bash, vous pouvez utiliser su - oracle -c $ 'sh gaw_stats.sh \' obj £ €: JHDBCDJ: HSHABSH \ '' code> qui ne fonctionnera pas si court de < code> sh code>, cependant.
La chose importante à propos de ce qui précède est que cela utilise des guillemets simples autour de la valeur littérale avec le $ code> s. Vous pouvez utiliser des guillemets doubles autour d'une expansion paramètre i> qui se développe à cette valeur, mais vous ne pouvez pas les utiliser autour de la valeur littérale elle-même.
Je ne peux pas ajouter $ juste après SU - Oracle -C. Si je l'ajoute après avoir entré dans l'outil, il fonctionnera comme su - oracle -c '$ sh myscript.sh ....
'$' ... '...' code> est un alternatif pour bash . C'est la syntaxe, pas quelque chose que vous pouvez mettre dans vos données. (Franchement, on me sens comme confondre la différence entre la syntaxe et les données est la moitié de la cause de cette question. Utilisation de
SU code> provoque un
Eval code> Pass lorsque la coquille qu'il invoque à analyser la Script il est passé, la ligne entre syntaxe et données fait i> est floue à ce point - mais il faut comprendre que c'est une exception, pas la règle, de penser tout droit sur ce qui se passe au moment de l'exécution ).
Quoi qu'il en soit, exactement b> Comment se passe l'outil que vous ne pouvez pas modifier invoquer su code>? Les détails précis importent, si nous allons munisser vos données dans une forme que la coque
su code> invoque interpréter correctement. Il se peut que cela ne puisse pas être corrigé, mais nous ne pouvons pas savoir de toute façon avant de voir la mise en œuvre sans simplifications ni modifications.
(ou plutôt, jusqu'à ce que nous voyions un exemple de reproductible minimal - le code le plus court possible que reproduit le problème exact i> et décrit quelles pièces peuvent être modifiées et ne peuvent pas être modifiées dans le cadre d'une solution proposée; si une question ne permet pas aux gens d'essayer de répondre à ce qu'ils sont et ne sont pas autorisés à changer, comment quelqu'un peut-il construire une réponse solide?)
... Mais de toute façon, vous devez utiliser $ '...' code> Lorsque vous passez des données sur le script, vous ne pouvez pas passer du script parent, vous pouvez modifier i>. Si vous exécutez
./ myProgram $ 'foo \ nbar' code>, le
$ code> ne fait pas partie du fichier
myprogram code> reçoit - c'est juste le Syntaxe que votre coquille i> est analysée pour comprendre qu'il devrait passer
myProgram code> un argument qui se compose du mot
foo code>, puis un littéral nouveauline, puis le mot
bar code>; Le signe du dollar et les citations sont supprimés par cette coquille de parent une fois qu'elle les utilise pour informer la manière dont elle devrait faire l'analyse. (Même la barre oblique inverse n'est pas transmise à
myProgram code> non plus!).
L'autre motif importante d'utiliser intégré printenv code> est que l'option
-v code> est impossible dans la commande externe. Sur mon système Linux,
/ usr / bin / printf code> génère une sortie plus portable, mais doit évidemment être dans une substitution de commande si nous devons attribuer à
cmd code>.
Modifier la deuxième commande SED en SED 'S / $ / $ € / G' CODE>
Ensuite, vous devriez obtenir votre sortie souhaitée. P>
Si vous souhaitez échapper à une valeur pour être en sécurité pour analyser en tant que code, utilisez
printf% q code> pour le faire automatiquement; N'essayez pas de le faire vous-même avec
sed code>.
Pouvez-vous être précis sur la manière dont
id1 code>,
id2 code>,
id3 code>, etc. sont censés être combinés dans
arg1 code> ,
arg2 code>,
arg3 code> et votre chaîne finale? (Est-ce une constante fixe? Qu'est-ce que est i> it?)
pourquoi i> essayez-vous de supprimer le
: code> s en arg4? Nous voyons cela dans votre code, mais je ne vois aucune description textuelle de l'intention.
BTW, pour comprendre pourquoi i> Vous ne devez pas ajouter de "s'échapper" aux chaînes littérales, voir Bashfaq # 50 ; Les mêmes malentendus qui conduisent aux pratiques que la FAQ traite de ceux qui conduisent à essayer de mettre des caractères d'évacuation (qui sont syntaxes) dans le contenu des variables de chaîne (qui sont des données).
Malheureusement, la façon dont votre script est en cours d'exécution i> détruit des informations avant même que le script ne soit même démarré, car la coque que
su code> est en train de remplacer
$ £ _ jghd code > Avec une chaîne vide (puisqu'il n'y a pas de variable de ce nom).
BTW, vous marquez ce
bash code>, mais en utilisant
sh code>. Ce sont deux coquilles différentes - si l'utilisation de
sh code> est délibérée, je suggérerais de changer la balise. (
sh code> ne garantit pas de fonctionnalités non décrites dans la spécification POSIX SH; même si votre système d'exploitation utilise une copie de
sh code> fourni par bash, il éteint certaines fonctionnalités lorsque invoqué sous ce nom).