参数扩展

时间:2015-08-02 07:11:19

标签: linux bash shell sh

我在shell中尝试使用以下代码进行参数扩展

#!/bin/sh
count
echo ${count:-60}
echo ${count:=120}
echo $count
echo ${count:+80}
x = 'The host name is google'
echo ${#x}

输出

./test_varexp.sh: line 2: count: command not found
60
120
120
80
./test_varexp.sh: line 7: x: command not found
0

上面的代码和输出在上下文中我有以下问题;

  1. 带有'='符号的参数扩展应该将count的值设置为120,当我们打印count的值时也会发生这种情况,但在下一行中,当我使用时,它会被覆盖与“+”相同,只应检查是否存在。有人可以解释这个异常吗?或者有人可以解释计数是否实际存在?

  2. ${#x}的参数展开完全没有效果。有人能告诉我是否有语法错误吗?

  3. 我正在尝试上面的代码

    [root@dtltrhel5u8 shellscripts]# uname -a
    Linux dtltrhel5u8 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
    

2 个答案:

答案 0 :(得分:3)

你在这里混淆了许多问题。 shell将在空白处(或通常在IFS上标记化您的输入,但尊重任何引用)并按顺序查找分配和命令。如果第一个令牌包含=,则它是一个赋值,后面可能会有进一步的赋值或命令。如果没有,则它是一个命令,任何剩余的参数都是命令参数。 (曾经有一段时间,分配也可以遵循一个命令,并且有一些方法可以使现代shell表现得像这样,为了向后兼容;但是让我们忽略那个侧面轨道。)

所以count是一个命令,显然不存在。也许你的意思是count=来定义没有值的变量(这与不设置它有所不同)。

如果变量设置且非空,则扩展${count:+80}生成值80;这正是你得到的。如果变量为空或未设置,则替换为空字符串。

如果您想为x分配一个值,那么等号和值必须是第一个令牌的一部分;所以

x='The host name is google'

分配工作后,字符串的长度将不再为零。

答案 1 :(得分:1)

文档http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

可以轻松解释您的第一个问题

具体而言,${count:+80}如果未设置count则返回任何内容,如果设置则80则返回count=的值仍为120。

您的其他语法错误是您不应在x='The host name is google' echo ${#x} 周围放置空格。

23

打印composer.json