Linux bash:多个变量赋值
- 2024-10-25 08:42:00
- admin 原创
- 77
问题描述:
在 Linux Bash 中是否存在类似于 PHP 中的以下代码:
list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ;
即你在一句话中为 3 个不同的变量分配相应的值。
假设我有一个 bash 函数myBashFuntion
,将字符串“qwert asdfg zxcvb”写入 stdout。是否可以执行以下操作:
(var1 var2 var3) = ( `myBashFuntion param1 param2` )
当然,等号左边的部分不是有效的语法。我只是想解释一下我要求什么。
但真正有效的是:
array = ( `myBashFuntion param1 param2` )
echo ${array[0]} ${array[1]} ${array[2]}
但是索引数组不像普通变量名那样具有描述性。
不过,我可以这样做:
var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]}
但我还是想避免这 3 种说法。
我只是在寻找一种快捷语法。可以吗?
解决方案 1:
我首先想到的是:
read -r a b c <<<$(echo 1 2 3) ; echo "$a|$b|$c"
输出结果不出所料
1|2|3
解决方案 2:
我想将值分配给一个数组。因此,我扩展了Michael Krelin 的方法,我这样做了:
read a[{1..3}] <<< $(echo 2 4 6); echo "${a[1]}|${a[2]}|${a[3]}"
其结果是:
2|4|6
正如预期的那样。
解决方案 3:
有时你必须做一些奇怪的事情。假设你想从命令中读取数据(例如 SDGuero 的日期示例),但又想避免多次分叉。
read month day year << DATE_COMMAND
$(date "+%m %d %Y")
DATE_COMMAND
echo $month $day $year
您也可以通过管道传入 read 命令,但是随后您必须使用子 shell 中的变量:
day=n/a; month=n/a; year=n/a
date "+%d %m %Y" | { read day month year ; echo $day $month $year; }
echo $day $month $year
导致...
13 08 2013
n/a n/a n/a
解决方案 4:
我认为这可能会有帮助......
为了在我的脚本中分解用户输入的日期(mm/dd/yyyy),我将日期、月份和年份存储到一个数组中,然后将值放入单独的变量中,如下所示:
DATE_ARRAY=(`echo $2 | sed -e 's/// /g'`)
MONTH=(`echo ${DATE_ARRAY[0]}`)
DAY=(`echo ${DATE_ARRAY[1]}`)
YEAR=(`echo ${DATE_ARRAY[2]}`)
解决方案 5:
如果要控制分隔符(即单个字符),可以IFS
结合使用read -r <vars> <<< '<list>'
:
IFS=',' read -r foo bar baz <<< 'foo,bar,baz'
echo "foo=$foo bar=$bar baz=$baz"
# => foo=foo bar=bar baz=baz
解决方案 6:
O'Reilly 的《Bash Cookbook》第 5 章详细讨论了变量赋值中“=”符号两边不能有空格的原因
MYVAR="something"
该解释与区分命令名称和变量有关(其中“=”可能是有效参数)。
这一切看起来有点像事后辩解,但无论如何都没有提到分配给变量列表的方法。
解决方案 7:
Shell 脚本最好将多个项目作为行来处理,因为大多数 CLI 程序都使用行来描述 i/o(除非它们使用空字节)。这可确保保留包含 shell 元字符(*
、?
、[
等)和 中的字符的输出IFS
。
myfunction () {
# output as lines
printf '%s
' 'Whatever, mate.' 'The "second" thing' "$(a-command-we-need-the-top-line-from | head -n 1)"
}
# read as an array
readarray -t myarray < <(myfunction)
# read individual variables
{
read -r var1
read -r var2
read -r var3
} < <(myfunction)
# output surrounded by ~ to show boundaries
printf '~%s~
' "${myarray[@]}" "${#myarray[@]}" "$var1" "$var2" "$var3"
产生如下结果:
~Whatever, mate.~
~The "second" thing~
~[2024-10-10T19:42Z] A thing happened that we logged!~
~3~
~Whatever, mate.~
~The "second" thing~
~[2024-10-10T19:42Z] A thing happened that we logged!~
解决方案 8:
让 var1=var2=var3=0
或
var1=var2=var3="默认值"
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件