我必须创建自己的命令 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