Приведение строки, чтобы не допустить интерполяции внутри функции в сценарии оболочки - PullRequest
0 голосов
/ 27 июня 2018

Я ищу способ напечатать звездочку в строке, переданной программе в оболочке. Эти проблемы похожи, но я не смог заставить ни одно из решений работать в моем случае: как мне отобразить звездочки на выходе , Печать звездочки (*) в оболочке bash , Как мне выбрать подстановочный знак / звездочку в bash? .

У меня есть следующий скрипт:

#!/bin/bash

# First function
function()
{
typeset -r str=$1
typeset -i N=$2
typeset -i i=0
while [[ $i -lt $N ]];
do
    echo $str| sed "s/<token>/$i/g"
    (( i+=1 ))
done
}

# 'main' function
doStuff()
{
foo.pl << EOF

some words $(function "input string with asterisk * and some <token> after it" 123)
some more words

EOF
    [ $? -eq 0 ] || logerror "Function 'doStuff' failed."
}

doStuff

exit 0

При запуске скрипта звездочка заменяется результатами echo *. Чтобы исправить это, я попытался объявить ASTERISK='*' и подставить его, а также просто изменить вызов функции на $(function "input string with asterisk "'*'" and some <token> after it" 123), но тоже не сработал.

Я подозреваю, что проблема заключается в операторе echo внутри function, но я не совсем уверен, как его решить, поэтому мой вопрос будет, если есть какой-либо способ привести str в function, чтобы не допустить для интерполяции, когда она находится в пределах function?

Ответы [ 2 ]

0 голосов
/ 27 июля 2018

Согласно предложению arco444 , используя set -o noglob до того, как sed в function добились цели.

0 голосов
/ 27 июня 2018

Вы можете окружить переменное расширение с помощью "", чтобы избежать глобуса.

echo "$str" | ...
...