如何解决在Bash中以行分隔的多个变量分配
对于bash中的变量分配,我通常执行以下操作:
a=1
b=2
c=3
如果在一行中完成,它将类似于:
a=1; b=2; c=3
最近我看到了一些类似的代码:
a=1 b=2 c=3
该分配由空格分隔,并且正在运行。我曾尝试用Google搜索这种方法,但无法快速找到教科书的答案。现在我才知道,它有效。
那么,所有的shell都支持这种语法吗?还是标准方法?
解决方法
是的。 SC2155是一个可能的警告,因为您应该单独声明和分配。
可以这么说,除了在参数之间使用多个声明选项外,它将起作用。另外请注意,声明参数将应用于所有变量(在本例中为-i)。
脚本0:
#!/bin/bash
declare a b c
a=foo
b=bar
c=baz
foo () {
local a=1 b=2 c=3
echo "From within func:"
declare -p a
declare -p b
declare -p c
}
foo
echo "From outside func:"
declare -p a
declare -p b
declare -p c
Output:
$ ./script.sh
From within func:
declare -- a="1"
declare -- b="2"
declare -- c="3"
From outside func:
declare -- a="foo"
declare -- b="bar"
declare -- c="baz"
脚本1:
#!/usr/bin/env bash
declare -i a -a b c
a=foo
b=(bar)
c=baz
foo () {
local -i a=1 -a b=(2) c=3
echo "From within func:"
declare -p a
declare -p b
declare -p c
}
foo
echo "From outside func:"
declare -p a
declare -p b
declare -p c
Output:
$ ./script.sh
./script.sh: line 3: declare: `-a': not a valid identifier
./script.sh: line 9: local: `-a': not a valid identifier
From within func:
declare -i a="1"
declare -ai b=([0]="2")
declare -i c="3"
From outside func:
declare -i a="0"
declare -ai b=([0]="0")
declare -i c="0"
,
POSIX将simple command定义为
“简单命令”是一系列可选的变量分配和重定向,可以按任意顺序进行,并可选地后跟单词和重定向,并由控制操作员终止。
请注意,赋值“语句”属于此定义:它只是一个或多个变量赋值,后面没有可选的单词来指定实际命令。
在同一部分后面,给出了这种无命令分配的语义:
,变量分配应按以下方式执行:
- 如果没有命令名称,则变量分配将影响当前的执行环境。
这是标准方法吗?
是的
摘自posix shell language 2.9.1 Simple Commands我的重点:
“简单命令”是可选变量赋值和重定向的序列,该序列以任意顺序,可选地后跟单词和重定向,并由控制操作员终止。
[...]
如果未产生命令名称,则变量分配将影响当前执行环境。 [...]
也可以从shell grammar中看到:
simple_command : cmd_prefix cmd_word cmd_suffix
| cmd_prefix cmd_word
| cmd_prefix
| cmd_name cmd_suffix
| cmd_name
cmd_prefix : io_redirect
| cmd_prefix io_redirect
| ASSIGNMENT_WORD
| cmd_prefix ASSIGNMENT_WORD
您可以在命令前放置任意数量的分配(和重定向)。如果没有命令,分配将影响当前的shell。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。