引入
所谓的前置变量赋值指的是在 BASH 命令之前添加变量的赋值语句,形如 var=value cmd args
,主要用于在命令运行期间临时地修改环境变量,从而不需要全局修改环境变量。这种方式设置的变量只会在命令运行期间生效,不会影响当前的shell环境。
示例
示例一:通过临时修改 IFS 变量值读取和处理 CSV 文件
IFS(Internal Field Separator)是BASH中与词拆分(词分解相关内容可见此博客)相关的一个环境变量。文件内容如下:
通过下面的代码可以正确地读取CSV文件并区分不同的字段:
while IFS=',' read name age # 为 read 命令临时修改 IFS 值
do
echo "$name is $age years old."
done < name_age.csv
示例二:消除本地化字符集设置
可以通过 locale
命令查看当前用户关于字符集的所有本地设置,例如我的本地设置为:
但不同的字符集,会影响一些与字符串操作相关的命令,如 sort
,为避免因为本地化设置引起的各种奇奇怪怪的问题,可以通过 LC_ALL=C <CMD>
在命令运行期间强制覆写所有本地化设置:
误区
前置赋值的变量只有在命令运行过程中有效,比如这条命令 name=balabala echo "hello $name"
并不能按照预期在终端打印 hello balabala,原因在于shell在echo
命令运行之前解析并展开了变量name的值,此时name变量设置并未生效,所以展开是一个空值。因此,关键在于防止变量提前展开,可以修改为 name=balabala bash -c 'echo "hello $name"'
(注意最外层的单引号),此时 name 只在bash命令运行期间展开,可以正确输出期望的结果。
水平有限,如有错误,欢迎在评论区指正