当前位置: 技术问答>linux和unix
关于shell整型变量
来源: 互联网 发布时间:2017-01-28
本文导语: 大家好,我看到一道shell程序: #!/bin/sh foo=1 while [ "$foo" -le 20 ] do echo "Here we go again" foo=$(($foo + 1)) #问题1.请问这句话改成“foo=$($foo + 1)”为什么不行?最里面的括号起到什么作用? done exit 0 问...
大家好,我看到一道shell程序:
问题2.shell整型变量还能如何实现自加呢?
请讨论这两个问题,谢谢!
#!/bin/sh
foo=1
while [ "$foo" -le 20 ]
do
echo "Here we go again"
foo=$(($foo + 1)) #问题1.请问这句话改成“foo=$($foo + 1)”为什么不行?最里面的括号起到什么作用?
done
exit 0
问题2.shell整型变量还能如何实现自加呢?
请讨论这两个问题,谢谢!
|
1,我是这么记忆的,()是数值运算,$()是获取一条命令的输出,所以$((a + b))就是得到a+b的值了。
2,数值计算可以用foo=$(expr 1 + 2) 或者 let foo=1+2 , 可以使用for循环让其自增, 比较灵活的for循环形式如下:
2,数值计算可以用foo=$(expr 1 + 2) 或者 let foo=1+2 , 可以使用for循环让其自增, 比较灵活的for循环形式如下:
#!/bin/bash
for ((i = 0; i 4 )) # 真
echo "Exit status of "(( 5 > 4 ))" is $?." # 0
(( 5 > 9 )) # 假
echo "Exit status of "(( 5 > 9 ))" is $?." # 1
(( 5 - 5 )) # 0
echo "Exit status of "(( 5 - 5 ))" is $?." # 1
(( 5 / 4 )) # 除法也可以.
echo "Exit status of "(( 5 / 4 ))" is $?." # 0
(( 1 / 2 )) # 除法的计算结果 /dev/null # 除数为0, 非法计算.
#
echo "Exit status of "(( 1 / 0 ))" is $?." # 1
for ((a=1; a combined_file
# 把file1, file2, file3连接在一起, 并且重定向到combined_file中.
cp file22.{txt,backup}
# 拷贝"file22.txt"到"file22.backup"中
在大括号中, 不允许有空白, 除非这个空白被引用或转义.
echo {file1,file2} :{ A," B",' C'}
file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
代码块
这个结构事实上创建了一个匿名函数(一个没有名字的函数). 然而, 与"标准"函数不同的是, 在其中声明的变量,对于脚本其他部分的代码来说还是可见的(除了用declare,typeset命令声明的变量)
()会开启一个新的子shell,{}不会开启一个新的子shell
(())常用于算术运算比较,[[]]常用于字符串的比较.
$()返回括号中命令执行的结果
$(())返回的结果是括号中表达式值
${ }参数替换与扩展
参数替换
${var}
${var}=$var
${var:-default} ${var-default}
如果var未set,那么就是用default.两者之间不同只有当var为空变量时,前者为default,后者为空.
${var:=default} ${var=default}
如果var未set,那么就设置default.两者之间不同只有当var为空变量时,前者设置为default,后者设置为空.
${var:+default} ${var+default}
如果var被set,就是用default.未set,就使用null字符串.两者之间不同只有当var为空变量时,前者为null字符串,后者为default.
上面三种参数替换中,第二种使用后变量的值被改变.
参数替换扩展
${#var} ${#array}
字符串长度或数组第一个元素的字符串长度
例外:
${#*}、${#@}指位置参数的个数.
${#array
},$[#array[@]}指数组元素的个数
${var#pattern} ${var##pattern}
从var开头删除最近或最远匹配pattern的子串.
${var%pattern} ${var%%pattern}
从var结尾删除最近或最远匹配pattern的子串.
${var:pos}
变量var从位置pos开始扩展.
${var:pos:len}
从位置pos开始,并扩展len长度个字符
${var/pattern/replacement} ${var//pattern/replacement}
使用replacement来替换var中的第一个或所有pattern的匹配.
${var/#pattern/replacement}
如果var的前缀匹配到了pattern,那么就用replacement来替换pattern.
${var/%pattern/replacement}
如果var的后缀匹配到了pattern,那么就用replacement来替换pattern.
${!varprefix*} ${!varprefix@}
前边所有声明过的,以varprefix为前缀的变量名.
[[]]就是条件表达式,在bash中,字符串比较用 >