![$VAR 的值已经包含反引号和/或单引号。怎么处理呢?如何正确地将 $VAR 传递给程序?](https://linux22.com/image/230401/%24VAR%20%E7%9A%84%E5%80%BC%E5%B7%B2%E7%BB%8F%E5%8C%85%E5%90%AB%E5%8F%8D%E5%BC%95%E5%8F%B7%E5%92%8C%2F%E6%88%96%E5%8D%95%E5%BC%95%E5%8F%B7%E3%80%82%E6%80%8E%E4%B9%88%E5%A4%84%E7%90%86%E5%91%A2%EF%BC%9F%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E5%9C%B0%E5%B0%86%20%24VAR%20%E4%BC%A0%E9%80%92%E7%BB%99%E7%A8%8B%E5%BA%8F%EF%BC%9F%20.png)
$ 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