$VAR 的值已经包含反引号和/或单引号。怎么处理呢?如何正确地将 $VAR 传递给程序?

$VAR 的值已经包含反引号和/或单引号。怎么处理呢?如何正确地将 $VAR 传递给程序?
$ bash --version
GNU bash, versione 5.2.26(1)-release (x86_64-pc-linux-gnu)

我不知道如何应对$VAR当其内部值包含单引号 ( ') 和/或反引号 ( `) 时。

我需要执行寻找基于-exec中找到的条目list.txt

list.txt包含:

  • 文件名.EXT每行
  • 每行以新队( \n)

作为验证一切正常的预防性测试,我运行以下命令:

$ while IFS= read -r song; do find /mnt/EXTHDD/unsorted -type f -name "$song"; done < list.txt
$ while IFS= read -r song; do find /mnt/EXTHDD/unsorted -type f -name "*$song*"; done < list.txt
$ while IFS= read -r song; do find /mnt/EXTHDD/unsorted -type f -name '$song'; done < list.txt
$ while IFS= read -r song; do find /mnt/EXTHDD/unsorted -type f -name "${song}"; done < list.txt

没有一个起作用...

不幸的是,由于特殊字符,并未列出所有出现的情况文件名因此$song变量无法正确引用(无论是双引号还是单引号)。

线条示例文件名.EXT在发现list.txt

Pino Daniele ~ [2000] Napul`e' - Raccolta completa ~ 01.14) `O ssaje comme fa `o core.mp3
[CONCERTI] Malora -- Live@TANT`E'! (Agosto '05, Villa Fossa` [presa diretta, mixer:stereo]) -- #15. 20:30 ... Tutto tace?.wave

答案1

这里的问题不是单引号 ( ') 和/或反引号 ( `)。

相反,我需要转义方括号([])以防止GNU 查找-name将(或)的值解释-iname全局

超级感谢穆鲁卡米尔·马乔罗夫斯基为我指明了正确的方向!

这是我解决这个问题的方法内线:

while IFS= read -r song; do 
  unsquare=$(printf '%s\n' "$song" | sed 's/\[/\\[/g;s/\]/\\]/g') && 
   find /mnt/EXTHDD/unsorted -type f -name "$unsquare" 
done < list.txt

相关内容