夕雾实验室
严谨的使用 bash

变量避免转义

你需要两层叠甲:

  • 为变量套上双引号
  • 在美元符号后面跟上花括号

最终结果应该是 echo "${aaa}"

为什么要这么复杂,做几个实验验证:

xiwu@hana:~/下载/Sayo Momo - GI NAVIA$ aaa="*"
xiwu@hana:~/下载/Sayo Momo - GI NAVIA$ echo $aaa
01.jpg 02.jpg 03.jpg 04.jpg 05.jpg 06.jpg 07.jpg 08.jpg 09.jpg 10.jpg 11.jpg 12.jpg 13.jpg 14.jpg 15.jpg 16.jpg 17.jpg 18.jpg 19.jpg 20.jpg 21.jpg 22.jpg 23.jpg 24.jpg 25.jpg 26.jpg 27.jpg 28.jpg 29.jpg 30.jpg 31.jpg 32.jpg 33.jpg 34.jpg 35.jpg 36.jpg 37.jpg 38.jpg 39.jpg 40.jpg 41.jpg 42.jpg 43.jpg 44.jpg 45.jpg 46.jpg 47.jpg 48.jpg 49.jpg 50.jpg 51.jpg 52.jpg 53.jpg 54.jpg 55.jpg 56.jpg 57.jpg 58.jpg 59.jpg 60.jpg 61.jpg 62.jpg 63.jpg 64.jpg V-1.mp4 V-2.mp4 V-3.mp4 V-4.mp4 V-5.mp4 V-6.mp4 V-7.mp4 V-8.mp4 V-9.mp4
xiwu@hana:~/下载/Sayo Momo - GI NAVIA$ echo ${aaa}
01.jpg 02.jpg 03.jpg 04.jpg 05.jpg 06.jpg 07.jpg 08.jpg 09.jpg 10.jpg 11.jpg 12.jpg 13.jpg 14.jpg 15.jpg 16.jpg 17.jpg 18.jpg 19.jpg 20.jpg 21.jpg 22.jpg 23.jpg 24.jpg 25.jpg 26.jpg 27.jpg 28.jpg 29.jpg 30.jpg 31.jpg 32.jpg 33.jpg 34.jpg 35.jpg 36.jpg 37.jpg 38.jpg 39.jpg 40.jpg 41.jpg 42.jpg 43.jpg 44.jpg 45.jpg 46.jpg 47.jpg 48.jpg 49.jpg 50.jpg 51.jpg 52.jpg 53.jpg 54.jpg 55.jpg 56.jpg 57.jpg 58.jpg 59.jpg 60.jpg 61.jpg 62.jpg 63.jpg 64.jpg V-1.mp4 V-2.mp4 V-3.mp4 V-4.mp4 V-5.mp4 V-6.mp4 V-7.mp4 V-8.mp4 V-9.mp4
xiwu@hana:~/下载/Sayo Momo - GI NAVIA$ echo "${aaa}"
*
xiwu@hana:~/下载/Sayo Momo - GI NAVIA$
xiwu@hana:~$ aaa="Hello World"
xiwu@hana:~$ echo $aaa
Hello World
xiwu@hana:~$ for i in $aaa;do echo $i;done
Hello
World
xiwu@hana:~$ for i in "$aaa";do echo $i;done
Hello World

xiwu@hana:~$ for i in "${aaa}";do echo $i;done
Hello World

引用 GPT4 的说法

在保护输入参数方面,$(echo "${i}") 提供了更好的转义安全性,因为它确保了变量 i 的值作为完整的字符串传递给 getName 函数。

而在保护命令输出方面,"$(echo ${i})" 通过引用命令替换的结果来提供转义安全性,但这不影响如何解析或处理到 getName 函数的输入参数。

为了在处理既有输入参数又有命令输出时获得最佳的转义安全性,建议采用 "$(echo "${i}")" 的形式,这样既能保护输入参数,又能确保输出作为一个整体被处理。

但双引号的区别

美元符号

功能复用

一些重复性的工作,比如分割文件扩展名等等,可以像现代编程语言一样"导入包",但实际上是通过 source来完成的

比如,设计一个 util.sh 放在任意环境变量路径中

#!/bin/bash

function getName(){    
    local f="${1}" 
    echo "${f%.*}"
}

在需要调用的时候如此使用

xiwu@hana:~/下载/Sayo Momo - GI NAVIA$ source path.sh
xiwu@hana:~/下载/Sayo Momo - GI NAVIA$ for i in *;do echo "$(getName "${i}")";done
01
02
03
..... # 余下内容省略

建议阅读

https://www.gnu.org/software/bash/manual/bash.html