1、shell 自加自减
shell中 自加的写法
((x++))
或者((x+=1))
减法同理
((x--))
或者((x-=1))
使用变量
a=1
a=$(($a+1))
a=$[$a+1]
a=`expr $a + 1`
还有一个办法,let
$let x=x+1
$let x=x-1
返回值问题:
- ((expression))
- The expression is evaluated according to the rules described
- below under ARITHMETIC EVALUATION. If the value of the expres-
- sion is non-zero, the return status is 0; otherwise the return
- status is 1. This is exactly equivalent to let "expression".
2、函数调用
Linux Shell中函数的基本形式
{
command1
command2
commandN
语法:
[ function ] funname [()]
{
action;
[return int;]
}
说明:
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
BASH 中函数参数的定义并不需要在函数定义处就制定,而只需要在函数被调用时用 BASH 的保留变量 $1 $2 ... 来引用就可以了;BASH 的返回值可以用 return 语句来指定返回一个特定的整数,如果没有 return 语句显式的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回错误码)。函数的返回值在调用该函数的程序体中通过 $? 保留字来获得。
用例1:
1 #1/bin/bash
2
3 function Sum()
4 {
5 echo $1,$2
6 return $(($1+$2))
7 }
8 Sum 1 2
9 echo $?
Loong:/home/yee/shell# sh -x func1.sh
+ Sum 1 2
+ echo 1,2
1,2
+ return 3 命令的返回值
+ echo 3
3 $? 打印出上一条命令的返回值;
Loong:/home/yee/shell#
函数返回值,只能通过$? 系统变量获得,直接通过=,获得是空值。函数是一个命令,在shell获得命令返回值,都需要通过$?获得
用例2:
1 #1/bin/bash
2
3 declare num=10
4 function Sum()
5 {
6 echo $num
7 ((num++))
8 return $num
9 }
10 Sum
11 function Sub()
12 {
13 local num=100
14 echo $num
15 ((num-=4 ))
16 return $num
17 }
18 Sub
19 echo $num
Loong:/home/yee/shell# sh -x func1.sh
+ declare num=10 全局变量
+ Sum
+ echo 10
10
+ (( num++ ))
+ return 11
+ Sub
+ local num=100 使用local自定义局部变量值,与外部变量无关
+ echo 100
100
+ (( num-=4 ))
+ return 96
+ echo 11 与局部变量无关
11
Loong:/home/yee/shell#
如果需要传出其它类型函数值,可以在函数调用之前,定义变量(这个就是全局变量)。在函数内部就可以直接修改,然后在执行函数就可以读出修改过的值。
如果需要定义自己变量,可以在函数中定义:local 变量=值 ,这时变量就是内部变量,它的修改,不会影响函数外部相同变量的值
附系统变量:(是整个程序,而不是程序内部)
$0 这个程序的执行名字
$n 这个程序的第n个参数值,n=1...9
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个背景指令的PID
$? 上一个指令的返回值
1 #1/bin/bash
2
3 function Sum()
4 {
5 echo $1,$2
6 return $(($1+$2))
7 }
8 Sum 3 4
9 echo $0
10 echo $2
11 echo $*
12 echo $#
13 echo $$
14 echo $!
15 echo $?
Loong:/home/yee/shell# sh func1.sh
参数为空
3,4 sum函数的echo值
func1.sh
程序的执行名字
0
参数个数
360
程序的PID
0
上一个指令的返回值
Loong:/home/yee/shell#
函数递归
LinuxShell中可以递归调用函数,即函数可以直接或间接调用其自身。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。一个递归调用的例子:
function12.sh演示了一个函数递归调用
#!/bin/bash
#递归调用函数
foo()
{
#调用函数
使用局部变量进行递归一般是针对数值运行来使用的。阶乘运算是一个使用局部变量的递归调用过程,实现了n!的运算,其可以通过下面的公式表示:
n!=1
(n=0)
n!=n*(n-1)!
(n>=1)
按照该公式可实现对阶乘的运算,由于该阶乘运算中存在终止条件“0!=1”,所以可以使用函数递归来实现该运算。
#function13.sh
#!/bin/bash
fact ()
{
}
fact $1
echo "Factorial of $1 is $?"
exit 0
3.sleep
NAME
sleep - delay for a specified amount of time
SYNOPSIS
sleep NUMBER[SUFFIX]...
sleep OPTION
DESCRIPTION
Pause for NUMBER seconds. SUFFIX may be `s' for seconds (the default), `m' for minutes, `h'
for hours or `d' for days. Unlike most implementations that require NUMBER be an integer,
here NUMBER may be an arbitrary floating point number. Given two or more arguments, pause
for the amount of time specified by the sum of their values.
停留设定的秒数,参数后缀可以是默认的以秒为单位,也可以是以m,h,d依次为分钟,小时,天为单位;不是要求每个数字都要求为整形,也可以是
浮点型的;超过两个以上的参数,会以它们的和作为执行结果;
Dos:
sleep(1); //停留1秒
delay(100); //停留100毫秒
Windows:
Sleep(100); //停留100毫秒
Linux:
sleep(1); //停留1秒
usleep(1000); //停留1毫秒
Sleep(n)//n毫秒
1.4 vim 替换
vi/vim 中可以使用 :s 命令来替换字符串
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上
从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索
字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
举例:
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:2,$s/vivian/sky/g 替换第 2 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/