可以在一行中声明多个局部变量吗

ibu*_*fen 13 bash

假设有一个 function/method foo。可以使用local关键字在一行中声明多个变量,还是必须为每个变量用一个声明语句分隔?

foo()
{
    local x y z
}
Run Code Online (Sandbox Code Playgroud)

或者

foo()
{
    local x
    local y
    local z
}
Run Code Online (Sandbox Code Playgroud)

并进一步:

foo()
{
    local -i x -a y  z
}

foo()
{
    local -i x=2 -a y=()  z
}

…
Run Code Online (Sandbox Code Playgroud)

或等效的一行一行声明。


是的。可以测试,但对于一个我找不到任何 Q/A,第二个 - 可能有一些隐藏的警告

jes*_*e_b 15

是的你可以。一个可能的警告是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
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./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"
Run Code Online (Sandbox Code Playgroud)

脚本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
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./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"
Run Code Online (Sandbox Code Playgroud)


Mag*_*gne 7

添加@jesse_b 的优秀答案。我可以确认这也有效(并考虑到SC2155的最佳实践):

foo()
{
  local x y z
  x=1
  y=2
  z=3
}
Run Code Online (Sandbox Code Playgroud)