首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时引用参数展开,并将参数名称括在大括号中?

何时引用参数展开,并将参数名称括在大括号中?
EN

Unix & Linux用户
提问于 2018-02-04 02:39:40
回答 2查看 3.5K关注 0票数 1

在参数展开中:

  • 对参数展开进行双引号总是比不引用更好(或者不是更糟)吗?是否有不建议双重引用的情况?
  • 何时需要在参数名称周围添加大括号?
  • 什么时候我们应该在参数展开前后使用双引号而不是参数名称的大括号呢?什么时候转过来的?两种方法中的任何一种什么时候起作用?

谢谢。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-02-04 03:01:18

Quote

当您希望将扩展值而不是拆分成几个单词并受IFS值的影响时,最好引用参数展开。例如:

代码语言:javascript
复制
$ IFS=" elr"
$ var="Hello World"
$ printf '<%s> ' $var; echo
 <> <>   <> 

$ printf '<%s> ' "$var"; echo

但是,有一些非常有限的实例需要进行未引用的扩展才能真正完成拆分:

代码语言:javascript
复制
$ IFS=主题链接:什么时候需要双重报价? 吉尔斯 圣法内·查泽拉斯Braces当变量名后面的字符不应与该变量名连接时,总是需要大括号:$ var=one
$ echo "The value of var is $varvalue"
The value of var is
$ echo "The value of var is ${var}value"
The value of var is onevalue来自LESS="+/which is not to be interpreted as part" man bash${参数}大括号是必需的…当参数后面跟着一个不能解释为其名称一部分的字符时。此外,当处理任何两位数的位置参数时,都需要大括号。$ set -- one two t33 f44 f55 s66 s77 e88 n99 t10 e11 t12
$ echo "$11 ${11} $12 ${12}"
one1 e11 one2 t12阅读手册:LESS="+/enclosed  in  braces" man bash当一个包含一个以上数字的位置参数被展开时,它必须用大括号括起来。或LESS="+/with more than one digit" man bash${参数}参数的值被替换。当参数是具有多个数字(…)的位置参数时,需要使用大括号。引号对Braces什么时候我们应该在参数展开前后使用双引号而不是参数名称的大括号呢?什么时候转过来的?两种方法中的任何一种什么时候起作用?没有关于“应”的规则,只有使用以下两种之一的公开可能性:$ var=One
$ echo "ThisIs${var}Var"
ThisIsOneVar

$ echo "ThisIs""$var""Var"
ThisIsOneVar

$ echo 'ThisIs'"$var"'Var'
ThisIsOneVar

$ echo 'ThisIs'"${var}"'Var'
ThisIsOneVar所有的扩展都是完全等价的,使用任何你更喜欢的。 \t\n'
$ var="one two three"
$ array=($var)
$ declare -p array
declare -a array=([0]="one" [1]="two" [2]="three")

主题链接:C4 C5 C6

K17BracesK28

当变量名后面的字符不应与该变量名连接时,总是需要大括号:

A9

来自D10

J111

${参数}大括号是必需的…当参数后面跟着一个不能解释为其名称一部分的字符时。

J212

此外,当处理任何两位数的位置参数时,都需要大括号。

A13

阅读手册:D14

J115

当一个包含一个以上数字的位置参数被展开时,它必须用大括号括起来。

J216

D17

J118

${参数}参数的值被替换。当参数是具有多个数字(…)的位置参数时,需要使用大括号。

J219K120引号对BracesK221J122

什么时候我们应该在参数展开前后使用双引号而不是参数名称的大括号呢?什么时候转过来的?两种方法中的任何一种什么时候起作用?

J223

没有关于“应”的规则,只有使用以下两种之一的公开可能性:

A24

所有的扩展都是完全等价的,使用任何你更喜欢的。

票数 5
EN

Unix & Linux用户

发布于 2018-02-04 02:47:42

需要大括号的一种情况是,当您要将变量用作字符串的一部分时:

代码语言:javascript
复制
$ var=test
$ echo "stuff$varmorestuff"
stuff
$ echo "stuff${var}morestuff"
stufftestmorestuff

如果没有大括号,shell认为我正在展开一个名为varmorestuff的变量,该变量没有设置。

来自bash参考手册3.5.3壳体参数扩展

“$”字符引入参数扩展、命令替换或算术扩展。要展开的参数名称或符号可以用大括号括起来,这些大括号是可选的,但有助于保护要展开的变量不受紧跟在其后面的字符的影响,这些字符可以解释为名称的一部分。

来自shell手册2.6.2参数展开

如果参数名称或符号未括在括号中,则展开应使用最长的有效名称(请参阅IEEE 1003.1-2001的基本定义卷,第3.230节,名称),无论该名称所表示的符号是否存在。

此外,当处理任何两位数的位置参数时,都需要大括号。

script.sh

代码语言:javascript
复制
#!/bin/sh
if [ "$1" = 'correct' ]; then
        echo "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}"
else
        echo "$2" "$3" "$4" "$5" "$6" "$7" "$9" "$9" "$10"
fi

在行动中:

代码语言:javascript
复制
$ ./script.sh one two three four five six seven eight nine ten
two three four five six seven nine nine one0
$ ./script.sh correct two three four five six seven eight nine ten
two three four five six seven eight nine ten

来自bash手册3.4.1位置参数

位置参数N可以引用为${N},或者当N由单个数字组成时可以引用为$N。

从shell手册2.6.2参数展开

参数名称或符号可以用大括号括起来,这些大括号是可选的,但具有多个数字的位置参数除外,或者参数后面跟着可以解释为名称一部分的字符。匹配的结束大括号应通过计算大括号级别、跳过封闭引号和命令替换来确定。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/421737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档