1.shell脚本是一个以.sh问扩展名的文件。
如:
#!/bin/bash
echo "Hello world!"
将代码保存为test.sh ,并cd到保存目录:
chmod +x ./test.sh //是脚本拥有执行权限
./test.sh //执行脚本
注意:一定要写成./test.sh,而不是test.sh。
1.1 定义变量
定义变量时,变量名不加$符号,如:
varriableName=“value”
注意:变量名和等号之间不能有空格
1.2 使用变量
使用一个定义过的变量,只要在变量名前面加$符号即可。如:
your_name="jason"
echo $your_name
echo ${your_name}
注意:变量名外面的花括号是可选的,加花括号的目的是让解释器识别变量的边界
1.3 只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。 如:
#!/bin/bash
myUrl="http://www.baidu.com"
readonly myUrl
myUrl="http://www.sohu.com"
1.4 删除变量
使用unset命令可以删除变量,如:
unset variable_name
2.变量类型
一、局部变量:
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他的shell启动的程序不能访问局部变量
二、环境变量:
包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要时候shell脚本也可以定义环境变量
三、shell变量:
shell变量时有shell程勋设置的特殊变量,shell变量中又一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
2.1 特殊变量
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n是一个数字,表示第几个参数,例如,第一个参数是$1,第二个$2
$# 传递给脚本或函数的参数的个数
$* 传递给脚本或者函数的所有参数
$@ 传递给脚本或函数的所有参数,被双引号“”包含时,与$*稍有不同
$$ 当前shell进程ID
2.2 命令行参数
运行脚本时传递给脚本的参数称为命令行参数,命令行参数用$n表示,如:$1表示第一个参 数,$2表示第二个参数
如:
#!/bin/bash
echo "file name:$0"
echo "first paramater:$1"
echo "second parameter:$2"
$*和$@的区别
$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1,$2的形式输出所有参数但是当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2”的形式输出所有参数;“$@”会将各个参数分开,以$1,$2的形式输出所有参数
例子:
a=10
echo -e "Value of a is $a \n"
运行结果:Value of a is 10
这里的-e表示对转义字符进行替换。
转义字符:
\\ 反斜杠
\a 警报,响铃
\b 退格(删除键)
\f 换页(FF),将当前位置移到下页开头
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
2.3 变量替换
变量替换可以根据变量的状态来改变它的值
${var} 变量本来的值
${var:-word} 如果变量var为空或已被删除(unset),那么返回word,但不改边var的值
${var:=word} 如果变量var为空或者已被删除(unset),那么返回word,并将var的值设置为word
${var:?message} 如果变量var为空或者已被删除(unset),那么将消息message送到标准错误输出,可以用来检测变量var是否可以被正常复制。若此替换出现在shell脚本中,那么脚本将停止运行
${var:+word} 如果变量var被定义,那么返回word,但不该表var 的值
例如:
echo ${var:-"variable is not set"}
echo "1 - Value of var is ${var}"
echo ${var:="variable is not set"}
echo "2 - Value of var is ${var}"
unset var
echo ${var:+"this is default value"}
echo "3 - Value of var is $var"
var="prefix"
echo "4 - Value of var is $var"
echo ${var:?"print this message"}
echo "5 - Value of var ${var}"
bash不支持简单的数学运算,但是可以通过其他命令来实现
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加:
val=`expr 2 + 2`
echo "Total value :$val"
注意:表达式和运算符之间要有空格,例如2+2是不对的,必须写成 2 + 2
完整的表达式要被 ` `包含,,注意这个字符不是常用的单引号,是ESC键下边。
2.4 算术运算符
例:
#!/bin/sh
b=20
val=`expr $a + $b`
echo "a+b:$val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
echo "a is not equal to b"
fi
注意:乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
if……then……fi是条件表达式
算术运算符列表
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 10。
* 乘法 `expr $a \* $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
注意:条件表达式要放在方括号之间,并且要有空格,例如[$a==$b]是错误的,必须写成[ $a == $b ].
2.5 关系运算符
例:
#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a is equal to b"
else
echo "$a -eq $b: a is not equal to b"
fi
if [ $a -ne $b ]
echo "$a -ne $b: a is not equal to b"
echo "$a -ne $b : a is equal to b"
if [ $a -gt $b ]
echo "$a -gt $b: a is greater than b"
echo "$a -gt $b: a is not greater than b"
if [ $a -lt $b ]
echo "$a -lt $b: a is less than b"
echo "$a -lt $b: a is not less than b"
if [ $a -ge $b ]
echo "$a -ge $b: a is greater or equal to b"
echo "$a -ge $b: a is not greater or equal to b"
if [ $a -le $b ]
echo "$a -le $b: a is less or equal to b"
echo "$a -le $b: a is not less or equal to b"
fi
关系运算符列表
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-ne 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
2.6 布尔运算符
例:
if [ $a != $b ]
echo "$a != $b : a is not equal to b"
echo "$a != $b: a is equal to b"
if [ $a -lt 100 -a $b -gt 15 ]
echo "$a -lt 100 -a $b -gt 15 : returns true"
echo "$a -lt 100 -a $b -gt 15 : returns false"
if [ $a -lt 100 -o $b -gt 100 ]
echo "$a -lt 100 -o $b -gt 100 : returns true"
echo "$a -lt 100 -o $b -gt 100 : returns false"
if [ $a -lt 5 -o $b -gt 100 ]
fi
布尔运算符列表
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
2.7 字符串运算符
例:
a="abc"
b="efg"
if [ $a = $b ]
echo "$a = $b : a is equal to b"
echo "$a = $b: a is not equal to b"
if [ -z $a ]
echo "-z $a : string length is zero"
echo "-z $a : string length is not zero"
if [ -n $a ]
echo "-n $a : string length is not zero"
echo "-n $a : string length is zero"
if [ $a ]
echo "$a : string is not empty"
echo "$a : string is empty"
fi
字符串运算符列表
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -z $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
2.8 文件测试运算符
例:
file="/var/www/tutorialspoint/unix/test.sh"
if [ -r $file ]
echo "File has read access"
echo "File does not have read access"
if [ -w $file ]
echo "File has write permission"
echo "File does not have write permission"
if [ -x $file ]
echo "File has execute permission"
echo "File does not have execute permission"
if [ -f $file ]
echo "File is an ordinary file"
echo "This is sepcial file"
if [ -d $file ]
echo "File is a directory"
echo "This is not a directory"
if [ -s $file ]
echo "File size is zero"
echo "File size is not zero"
if [ -e $file ]
echo "File exists"
echo "File does not exist"
fi
文件测试运算列表
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
[ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是具名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
shell注释都是以#开头的
3.shell字符串
3.1 单引号
str=‘this is a string’
单引号字符的限制:
·单引号里的任何字符都会原样输出,单引号字符串中的变量时无效的
·单引号字符串中不能出现单引号(对单引号使用转义符后也不行)
3.2 双引号
your_name='jason'
str="hello,I know your are \"your_name\"!\n"
双引号的优点:
·双引号里可以有变量
·双引号可以出现转义字符
3.3 拼接字符串
your_name="jason"
greeting="hello,"$your_name"!"
greeting_1="hello,${your_name}!"
echo $greeting $greeting_1
3.4 获取字符串长度
string=“abcd”
echo ${#string} #输出 4
3.5 提取子字符串
string="alibaba is a great company"
echo ${#string:1:4} #输出liba
注:如果是string[1:4]是包含头,不包含结尾的,例如:string[1:4]值为:lib
3.6 查找子字符串
string=“alibab is a great company”
echo `expr index "$string' is`
4.定义数组
在shell中,用括号来表示数组,数组元素用“空格”符号分割开,定义数组的一般形式为:
array_name=(value1 …… valuen)
例:
array_name=(value0 value1 value2 value3)
或者 array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
4.1 读取数组
读取数组元素值一般格式是:
${array_name[index]}
如:
valuen=${array_name[2]}
4.2 获取数组的长度
length=${#array_name[@]}或length=${#array_name[*]}或length=${#array_name[n]}
5.echo 是shell的一个内部指令,用于在屏幕上打印出指定的字符串,
命令格式:echo arg
显示转义字符:
echo “\"It is a test\"” 双引号可以省略
5.1 显示变量
name=“OK”
echo “$name It is a test”
5.2 显示不换行
echo “OK!\c”
echo "It is a test"
echo "It is a test" >myfile
5.4 原样输出字符串
echo '$name\”' 如需要原样输出字符串(不进行转义),请使用单引号
6.shell printf命令:格式化输出语句 例:
$printf "hello,shell\n"
printf format-string [arguments...]
format-string 为格式控制字符串,arguments为参数列表。
如:
# format-string为双引号
$ printf "%d %s\n" 1 "abc"
1 abc
# 单引号与双引号效果一样
$ printf '%d %s\n' 1 "abc"
# 没有引号也可以输出
$ printf %s abcdef
abcdef
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
$ printf %s abc def
$ printf "%s\n" abc def
abc
def
$ printf "%s %s %s\n" a b c d e f g h i j
a b c
d e f
g h i
j
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
$ printf "%s and %d \n"
and 0
$ printf "The first program always prints'%s,%d\n'" Hello Shell
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0'
$
注意:根据POSIX标准,浮点格式%e、%E、%f、%g与%G是“不需要被支持”。这是因为awk支持浮点预算,且有它自己的printf语句。这样Shell程序中需要将浮点数值进行格式化的打印时,可使用小型的awk程序实现。然而,内建于bash、ksh93和zsh中的printf命令都支持浮点格式。
7.shell if else语句
7.1 if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。
Shell 有三种 if ... else 语句:
if ... fi 语句;
if ... else ... fi 语句;
if ... elif ... else ... fi 语句。
1.if……else语句
语法:
@H_403_1237@
if [ expression ]