C Shell 中的变量替换

C Shell 维护一组变量,每个变量有零个或多个字的列表作为其值。 这些变量中的一些是由 Shell 设置或由其引用的。 例如, argv 变量是 Shell 变量列表的映像,并且组成此变量的值的字以特殊方式引用。

要更改和显示变量的值,请使用 setunset 命令。 在由 Shell 引用的变量中,数字是开关(打开或关闭对象的变量)。 Shell 不检查值的开关,只检查它们是否设置或取消设置。 例如,verbose Shell 变量是使命令输入回传的开关。 此变量的设置由在命令行上发出 -v 标志产生。

其他操作将变量当作数字处理。 @ 命令执行数字计算,并将结果指定给变量。 然而,变量值总是表示为(零个或多个)字符串。 对于数字操作,认为空字符串是零,忽略多字值的第二个字和后继字。

当您发出命令时,Shell 分析输入行并执行别名替换。 下一步,在运行命令前,它执行变量替换。 $ 字符用键固定替换。 但如果后跟空白、制表符或换行符,那么它不更改地传递。 在 $ 字符前加 \ 防止此扩展,以下两种情况除外:

  • 命令用 " " 括起。 在这种情况下,Shell 总是执行替换。
  • 命令用 ' ' 括起。 在这种情况下,Shell 从不执行替换。 以 ' ' 括起的字符串解释为命令替换。

Shell 在变量扩展前识别输入和输出重定向,并独立地展开每个重定向。 否则,命令名和完整的自变量列表一起展开。 因此第一个(命令)字可能生成多个字,其中第一个字成为命令名,而其余的字成为参数。

除非用 " " 括起或给定 :q 修饰符,否则变量替换的结果可能最终服从于命令替换和文件名替换。 当用双引号括起时,其值由多个字组成的变量展开成单个字或单个字的一部分,并且变量值的字以空白分隔。 当对 :q 修饰符应用于替换时,变量展开成多个字。 每个字以一个空白分隔并用双引号括起,以防止以后的命令替换或文件名替换。

以下标志法允许您将变量值引入到 Shell 输入中。 除非另有说明,否则引用不是使用 set 命令设置的变量是错误的。

您可将修饰符 :gh:gt:gr:h:r:q:x 应用于以下替换。 如果 { } 在命令格式中出现,那么修饰符必须放置在大括号中。 在每个变量扩展上只允许一个 : 修饰符。


描述
$姓名   
${名称} 由指定给 Name 变量的字替换,每个字用空白分隔。 大括号将 Name 变量与任何后面的字符隔开,否则后面的字符会成为变量的一部分。 Shell 变量名以字母开始,并由最多 20 个字母和数字组成,包括下划线(_)字符。 如果 Name 变量不指定 Shell 变量,但在环境中设置了,那么返其值回。 在这种情况下,前加冒号的修饰符以及在此描述的其他格式不可用。
$姓名[数目  
${名称[number]} 只从 Name 变量的值中选择一些字。 该数字将进行变量替换,并且可能由单个数字或由连字符 (-) 分隔的两个数字组成。 变量的字符串值的第一个词编号为 1。 如果省略范围的第一个数字,那么缺省值为 1。 如果省略了范围的最后一个数字,那么缺省为 $#Name。 星号(*)选择所有字。 如果第二个自变量省略或在某一个范围中,那么范围为空不是错误。
$#姓名  
${#名称} 给出 Name 变量中的字号码。 这可在 [number] 中使用,如以上显示。 例如,$Name[$#Name]
0 美元 取代文件的名称,命令输入从该文件读取。 如果名称未知,那么发生错误。
$数目  
${number} 等价于 $argv[number]
$* 等价于 $argv[*]

以下替换可能不使用 : 修饰符更改:

描述
$?名称   
${?名称} 如果 name 变量已设置,那么取代字符串 1,如果此设置未设置,那么取代字符串零 (0)。
$?0 如果当前输入文件名已知,那么取代 1,如果文件名未知,那么替取代 (0)。
$$ 取代父 Shell 的(十进制)进程号。
$< 取代来自标准输入的一行,而不进一步解释。 使用此替换在 Shell 步骤中从键盘读。