test.sh
#!/bin/bash
foo()
{
echo $1;
}
foo $1
将脚本运行为: ./ test.sh abc $ 1xyz
输出是:
abcxyz
但期望输出是:
abc$1xyz
所以,这里$ 1的值正在替换为空,但我想阻止它。我知道我们可以使用像 foo' abc $ 1xyz' 这样的单引号,但实际上我无法做到这一点,因为这个价值会从第三人传来,我可以& #39;告诉他们添加单引号或任何转义字符。所以,请让我知道是否还有其他可用的工作。
修改:根据请求的评论,请告诉我您仍然需要明确表示拒绝投票的人。
答案 0 :(得分:3)
简而言之,你无法做你想做的事。如果有人从命令行使用您的工具,他们只需根据shell的规则使用您的命令。
您看到的行为是因为shell会在程序看到它之前翻译参数 。你的命令绝对没有办法影响调用之前发生的事情。
正因为如此 - 因为shell在运行脚本之前处理参数 - 引用是在第一时间创建的。引用(单引号,双引号和反斜杠引号)的存在是为了让用户在调用某个函数之前控制参数的处理方式。
因此,如果您希望将abc$1xyz
这样的字符串发送到您的程序而不进行可变扩展,那么您有两个选择:
答案 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的响应。