【发布时间】:2015-04-12 15:54:24
【问题描述】:
起初我想确保我已经找了几个小时的答案,我已经阅读了很多类似的问题,但没有一个能解决我的问题。
现在直入主题:
我在 bash 中有两个脚本:一个是为我做一些事情的“工具”,第二个是主要的“用户”脚本。 我想将各种模式传递给工具脚本(如“[A-Za-z0-9]*”或“&”)
这里有一些代码:
#!/bin/bash
SET() {
wz1=`./PREP2.sh $1 $2 '[0-9A-Za-z]\*'`
wz2=`./PREP2.sh $1 $2 '&'`
echo $wz1
echo $wz2
}
SET $1 $2
如果我这样声明模式,工具脚本实际上可以工作:
line='[0-9A-Za-z]*'
但是当我用
传递相同的模式时'\*'
如果不将“*”解释为“显示目录中的所有文件”,我就无法摆脱“\”。
我一直在尝试像这样在工具中使用 eval:
eval echo '$3'
但是没有用。
完整的代码如下。
用户脚本:
#!/bin/bash
SET() {
#echo '[0-9A-Za-z]*'
wzor1=$(./PREP2.sh "$1" "$2" '[0-9A-Za-z]*')
wzor2=`./PREP2.sh $1 $2 '&'`
echo $wzor1
echo $wzor2
}
SET $1 $2 $4
工具代码
#!/bin/bash
PREP2() {
#echo "$3"
wzor="`./PREP.sh $1 $2 | tee linie.txt`"
#tmp="`echo $wzor | sed 's/,/,%/'`"
#echo $tmp;
./ZAMIEN_WSZYSTKIE_WYSTAPIENIA.sh linie.txt , @%
#tmp="`echo $wzor | tr '@' '\n x' | tee linie.txt`"
tmp="`tr '@' '\n x' < linie.txt | tee linie.txt`"
llini=`echo "$tmp" | wc -l`
#echo liczba lini $llini
i=1
wzor=""
while [ $i -le $llini ];
do
linia="`eval sed -n -e $i\p linie.txt | cut -d '%' -f2`"
if [ -z "$linia" ];then
#linia='[0-9A-Za-z]*'
linia=`eval '$3'`
#echo $linia
fi
if [ $i -ne 1 ];then
#echo "kolejna wartosc"
wzor=$wzor\,$linia
else
#echo "pierwsza wartosc"
wzor=$linia
fi
i=`expr $i + 1`
done
echo $wzor
#wynik="`grep -v "$wzor" $1`"
#echo "$wynik" > $1
#echo $nowy_wpis >> $1
}
eval echo "$3"
#PREP2 $1 $2 $3
为了澄清问题,我实际上并没有进入程序,因为我知道它的工作很奇怪,因为我在其中添加了参数。
【问题讨论】:
-
一般来说,最好使用
$(…)符号而不是反引号。但是,这与您的问题无关。 -
为什么要在
'\*'中添加反斜杠?为什么不使用'*'? -
我看到了你的更新,我没有看到我说你应该放的所有
"。您必须将它们放在几乎任何地方,尤其是在对函数的调用和所有回声中。在所有对 prep2 的调用中。 -
哦,这里的代码 sn-p 是用于 Web 内容(html/css/Javascript)的。请不要将其用于 shell 脚本。
-
抱歉,请问哪个选项可以让我保持这种代码视图,但不会显示这种“运行 sn-p”的东西?
标签: bash special-characters argument-passing