如何在 shell 脚本中传递不带引号的参数?

如何在 shell 脚本中传递不带引号的参数?

我必须创建自己的命令 shell,其中 bash 脚本调用 shell 可执行文件并使用引号执行此操作。问题是,当我尝试使用逻辑运算符执行此操作时,引号似乎会关闭特殊字符&&。例如:

var=("echo hello && mkdir testing")
./rshell ${var}

命令 shell 最终输出,hello && mkdir testing而不是实际遵循操作符的逻辑,成功输出 hello,然后进行目录测试。我怎样才能解决这个问题?

答案1

这绝对看起来像一个xy问题。了解最终目标是什么会有所帮助,但是:

  • 你的变量var实际上是一个大批因为var=( ... )语法
    • 因为您引用了括号中的所有内容,所以您将所有数据添加到单个元素中
    • 您没有使用正确的语法来调用数组 ( ${var[@]}) ,在本例中这并不是什么大问题,因为无论如何一切都在单个元素中

最大的问题似乎是逻辑 AND 的引用和解释方式。如果您在添加到数组时不引用它,shell 将尝试对其进行求值,如果您确实引用它,它将仍然是一个文字字符串,从而阻止求值。我能够解决此问题的方法之一(不使用eval)是使用以下方法:

脚本文件

#!/bin/bash

bash -c "$(echo $@)"

$ tree
.
└── script.sh

0 directories, 1 file
$ cmd=(echo hello \&\& mkdir test)
$ ./script.sh "${cmd[@]}"
hello
$ tree
.
├── script.sh
└── test

1 directory, 1 file

相关内容