我有一个变量列表,我将一个文件中的一个变量复制粘贴到我的 shell 中,然后点击Enter执行。例如:
var1="myvar1"
var2="myvar2"
因为实际中变量比较多,所以我希望一次操作就能完成所有操作,而不是复制粘贴并一一执行,以节省时间。
我尝试复制粘贴:
(
var1="myvar1"
var2="myvar2"
)
echo $var1
以相关格式输出空行而不是日期。
如何在一次操作中执行几个变量?
答案1
你不必一一复制它们,你可以将所有行粘贴在一起,换行符将用作 Enter。
原因是
(
var1="myvar1"
var2="myvar2"
)
不起作用是因为它是在子 shell 中执行的。如果你在final之前打印变量的内容,它会起作用
)
:
(
var1="myvar1"
var2="myvar2"
echo $var2
)
它在Commpound Commands
以下部分中进行了解释man bash
:
复合命令
复合命令是以下命令之一。在大多数情况下,命令描述中的列表可以通过一个或多个换行符与命令的其余部分分隔开,并且后面可以用换行符代替分号。
(list) list 在子 shell 环境中执行(请参阅下面的命令执行环境)。影响 shell 环境的变量分配和内置命令在命令完成后不再有效。返回状态是list的退出状态。
后来又说:
{ 列表; } list 只是在当前 shell 环境中执行。列表必须以换行符或分号结束。这称为组命令。返回状态是list的退出状态。请注意,与元字符 ( 和 ) 不同,{ 和 } 是保留字,并且必须出现在允许识别保留字的位置。由于它们不会导致断词,因此必须用空格或其他 shell 元字符将它们与列表分隔开。
因此,这将起作用,因为命令不会在子 shell 中执行,而是在当前 shell 环境中执行:
{
var1="myvar1"
var2="myvar2";
}
我发现您问了很多关于 的简单问题Bash
。考虑阅读一些 Bash 教程,man bash
并了解常见的重击陷阱。
答案2
您使用的括号会导致子 shell 执行所包含的命令;因此,一旦该 shell 退出,de 变量仍然不会在当前 shell 中设置。
我不知道为什么你认为这些括号会“一次性”设置这些变量,或者为什么有必要“一次性”设置这些变量;但是您可以将这些分配放在一行上,例如:
var1="myvar1" var2="myvar2"
当然,正如 Arkadiusz Drabczyk 所评论的那样,如果这样更容易而且能完成你想要完成的事情,那么没有理由不将这些行全部复制并粘贴到一起。