如何防止替换$ 1值,同时将参数值传递为' abc $ 1xyz'在shell脚本中

时间:2016-12-01 06:57:23

标签: bash shell sh

test.sh

#!/bin/bash

foo()
{
   echo $1;        
}
foo $1

将脚本运行为: ./ test.sh abc $ 1xyz

输出是:

abcxyz

但期望输出是:

abc$1xyz

所以,这里$ 1的值正在替换为空,但我想阻止它。我知道我们可以使用像 foo' abc $ 1xyz' 这样的单引号,但实际上我无法做到这一点,因为这个价值会从第三人传来,我可以& #39;告诉他们添加单引号或任何转义字符。所以,请让我知道是否还有其他可用的工作。

修改:根据请求的评论,请告诉我您仍然需要明确表示拒绝投票的人。

4 个答案:

答案 0 :(得分:3)

简而言之,你无法做你想做的事。如果有人从命令行使用您的工具,他们只需根据shell的规则使用您的命令。

您看到的行为是因为shell会在程序看到它之前翻译参数 。你的命令绝对没有办法影响调用之前发生的事情。

正因为如此 - 因为shell在运行脚本之前处理参数 - 引用是在第一时间创建的。引用(单引号,双引号和反斜杠引号)的存在是为了让用户在调用某个函数之前控制参数的处理方式

因此,如果您希望将abc$1xyz这样的字符串发送到您的程序而不进行可变扩展,那么您有两个选择:

  • 要求用户在调用程序之前使用其他一些不翻译参数的shell,或者
  • 要求用户使用shell的工具来正确引用他们的参数。

答案 1 :(得分:1)

此:

#!/bin/bash
foo() { echo "$1"; }

foo "$1"

执行时,将执行此操作:

$ set -- "Hello World"
$ test.sh "abc${1}xyz"
abcHello Worldxyz

如果你想要的是输出字符串有$,那么运行:

$ set -- "Hello World"
$ test.sh "abc\$1xyz"
abc$1xyz

我想不出任何其他方式来解释您的请求。

答案 2 :(得分:1)

您的脚本将如下所示

#!/bin/bash

foo()
{
   echo $1;
}
foo $1

执行如下:./test.sh 'abc$1xyz'

修改

为什么不使用这样的东西?

#!/bin/bash

echo "Enter input"

read input

foo()
{
   echo $1;
}
foo $input

执行:./test.sh

答案 3 :(得分:1)

只是为了澄清,因为我的印象是你仍然没有说明问题:

我有这样的印象 - 这就是让您的帖子混淆的原因 - 您正在寻找一种方法来更改您的脚本以实现所需的行为。这在技术上是不可能的,因为你指的是abc$1xyz中的$ 1,而不是我在脚本中看到的两个$1

在调用脚本的方式中,脚本永远不会看到abc$1xyz中的 $ 1 ;在调用端调用脚本之前替换它。要更改此行为,您需要对过去行进的时间机器进行编程并撤消此更改。

如果您的脚本的调用者希望 $ 1 按字面意思传递,他/她必须关心它 - 例如,请参阅@yogur的响应。