在参数展开中:
谢谢。
发布于 2018-02-04 03:01:18
当您希望将扩展值而不是拆分成几个单词并受IFS值的影响时,最好引用参数展开。例如:
$ IFS=" elr"
$ var="Hello World"
$ printf '<%s> ' $var; echo
<> <> <>
$ printf '<%s> ' "$var"; echo但是,有一些非常有限的实例需要进行未引用的扩展才能真正完成拆分:
$ 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
所有的扩展都是完全等价的,使用任何你更喜欢的。
发布于 2018-02-04 02:47:42
需要大括号的一种情况是,当您要将变量用作字符串的一部分时:
$ 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
#!/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在行动中:
$ ./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参数展开
参数名称或符号可以用大括号括起来,这些大括号是可选的,但具有多个数字的位置参数除外,或者参数后面跟着可以解释为名称一部分的字符。匹配的结束大括号应通过计算大括号级别、跳过封闭引号和命令替换来确定。
https://unix.stackexchange.com/questions/421737
复制相似问题