【问题标题】:How to pass asterisk as argument to another script in bash如何将星号作为参数传递给bash中的另一个脚本
【发布时间】: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


【解决方案1】:

报价,报价,报价和更多报价。并且更喜欢$() 而不是反引号,这样可以避免一些引用问题。

#!/bin/bash

SET() {

  wz1=$(./PREP2.sh "$1" "$2" '[0-9A-Za-z]*')
  wz2=$(./PREP2.sh "$1" "$2" '&')

  echo "$wz1"
  echo "$wz2"
}
SET "$1" "$2"

(顺便说一句:函数名全部大写是不常见的。这通常用于环境变量。)

【讨论】:

  • 对不起,它不工作。仍然当我在我的工具脚本中使用 echo $3 时,它会显示我目录中的所有文件。
  • 不要echo $3echo "$3"
  • 那么您在其他地方缺少引号。请使用重现您的问题的可运行示例更新您的问题,包括您如何运行它。
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2022-12-08
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
相关资源
最近更新 更多