答案1
在执行命令行之前,命令行中的变量绑定不会发生。但是 的参数替换是$file
在命令展开时发生的,这必须在执行之前发生。
解决这个问题的方法是将命令放入函数中:
fun()
{
echo "file = " $file
}
file=abc fun
答案2
命令
file="test" echo $file
不输出test
,因为扩展发生在运行命令之前。看一下这个:
$ set -x
$ foo='hello' echo $foo
+ foo=hello
+ echo
当您运行 Unix shell 脚本而不是运行 shell 命令时,不会发生同样的情况,例如,
foo='hello' /path/to/script.sh
在这种情况下,foo='hello'
首先解析分配,然后/path/to/script.sh
运行。
一些以前的和有关的 帖子持久变量赋值 + CLI 命令的建议解决方案:
foo='hello' bash -c 'echo $foo'
: 使用shell脚本是不可取的!简单命令的冗长方法。(){ local var=value; echo "1: $var"; }; echo "2: $var"
: 使用函数是不可取的!简单命令的冗长方法。TEST=foo && echo $TEST
: 简单但坚持。
我的出路是
(file="test"; echo $file)
通过创建子shell,您可以创建一个shell变量,在echo
命令中使用它,然后它就不会保留在该命令之外。