Bash:由于不必要的转义,脚本中的扩展功能无法正常工作

Rol*_*and 9 bash escaping brace-expansion

我想在bash脚本中做这样的事情.我正在使用bash 4.1.10.

# rm -rf /some/path/{folder1,folder2,folder3}
Run Code Online (Sandbox Code Playgroud)

从shell本身可以很好地(并且如预期的那样)工作.它会删除3个所需的文件夹,而不会触及所有其他文件夹.

当我把它放入脚本时会发生不必要的事情.例如,我的脚本:

#!/bin/bash
set -x
VAR="folder1,folder2,folder3"
rm -rf /some/path/{$VAR}
Run Code Online (Sandbox Code Playgroud)

执行此脚本时,不会删除文件夹.

我认为这是因为发生了一些不需要的引用.脚本输出使用#!/bin/bash -x:

rm -rf '/some/path/{folder1,folder2,folder3}'
Run Code Online (Sandbox Code Playgroud)

由于'商标,当然不能成功.

如何在我的脚本中使用它?

Mic*_*man 11

根据手册页:

扩展的顺序是:括号扩展,波浪扩展,参数,变量和算术扩展和命令替换(以从左到右的方式完成),单词拆分和路径名扩展.

因此,要解决这个问题,请添加另一个级别的扩展:

eval "rm -rf /some/path/{$VAR}"
Run Code Online (Sandbox Code Playgroud)


gle*_*man 5

由于您正在编写脚本,因此没有理由使用eval技巧编写难以维护的代码

VAR="f1,f2,f3"
IFS=,
set -- $VAR
for f; do
  rm -r "/path/to/$f"
done
Run Code Online (Sandbox Code Playgroud)

要么

VAR=( f1 f2 f3 )
for f in "${VAR[@]}"; do 
  rm -r "/path/to/$f"
done
Run Code Online (Sandbox Code Playgroud)