学习目标:
Linux速成八、
学习内容:
1、shell传递参数
2、shell数组
3、shell运算符
4、shell echo命令
1、shell参数传递
- 向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
- 参数:
$# : 传递到脚本的参数个数
$* : 以一个单字符串显示所有向脚本传递的参数,如"$*"用「"」括起来的情况、以"$1 $2 …$n"的形式输出所有参数
$$ : 脚本运行的当前进程ID号
$! : 后台运行的最后一个进程的ID号
$@ :与$*相同,但是使用时加引号,并在引号中返回每个参数,如"$@"用「"」括起来的情况、以"$1" "$2" … "$n": 的形式输出所有参数
$- : 显示Shell使用的当前选项,与set命令功能相同
$? : 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
- 例题:
1、向yyt.sh文件提交三个参数,执行程序时需要为脚本程序设置执行权限
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
结果:
[root@localhost project]# ./yyt.sh 9 9 8
Shell 传递参数实例!
执行的文件名:./yyt.sh
第一个参数为:9
第二个参数为:9
第三个参数为:8
2、显示每个参数和个数以及第三个参数
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第三个参数为:$3";
echo "参数个数为:$#";
echo "参数分别为:$*";
结果:
[root@localhost project]# ./yyt.sh 4 5 6
Shell 传递参数实例!
执行的文件名:./yyt.sh
第三个参数为:6
参数个数为:3
参数分别为:4 5 6
3、此处演示$* 与 $@ 区别:
eg:显示{1 2 3},$*显示为"1 2 3",而$@显示为"1" "2" "3"
[root@localhost project]# cat yyt.sh
#!/bin/bash
echo "__ \$* 演示 __"
for i in "$*";
do
echo $i
done
[root@localhost project]# ./yyt.sh 1 2 3
__ $* 演示 __
1 2 3
echo "__ \$@ 演示 __"
for i in "$@";
do
echo $i
done
[root@localhost project]# ./yyt.sh 1 2 3
__ $@ 演示 __
1
2
3
2、shell数组
- 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP类似),与大部分编程语言类似,数组元素的下标由0开始,Shell 数组用括号来表示,元素用"空格"符号分割开
- 例题:定义数组1-5,并按要求读出
首先定义数组:
arry=(1 2 3 4 5)
或者
arry[0]=1
arry[1]=2
arry[2]=3
arry[3]=4
arry[4]=5
按要求读出数组:
将数组中的内容挨个输出
#!/bin/bash
arry=(1 2 3 4 5)
echo "第一个元素为:${arry[0]}"
echo "第二个元素为:${arry[1]}"
echo "第三个元素为:${arry[2]}"
echo "第四个元素为:${arry[3]}"
echo "第五个元素为:${arry[4]}"
[root@localhost project]# ./yyt.sh
第一个元素为:1
第二个元素为:2
第三个元素为:3
第四个元素为:4
第五个元素为:5
使用@ 或 * 可以获取数组中的所有元素
#!/bin/bash
arry=(1 2 3 4 5)
echo "数组元素为:${arry[*]}"
[root@localhost project]# ./yyt.sh
数组元素为:1 2 3 4 5
或者
#!/bin/bash
arry[0]=1
arry[1]=2
arry[2]=3
arry[3]=4
arry[4]=5
echo "数组元素为:${arry[@]}"
[root@localhost project]# ./yyt.sh
数组元素为:1 2 3 4 5
输出拥有元素的个数
#!/bin/bash
arry[0]=1
arry[1]=2
arry[2]=3
arry[3]=4
arry[4]=5
echo "数组元素个数为:${#arry[@]}" / echo "数组元素个数为:${#arry=[*]}"
[root@localhost project]# ./yyt.sh
数组元素个数为:5
3、shell运算符
- Shell 和其他编程语言一样,支持多种运算符,包括:算数运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符
- expr 是一款表达式计算工具,使用它能完成表达式的求值操作,表达式和运算符之间要有空格
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
- 算数运算符:
a=100;b=200
+:加法
expr $a + $b
结果为 300
-:减法expr $a - $b
结果为 -100
*:乘法expr $a \* $b
结果为 2000
/:除法expr $b / $a
结果为 2 %:取余expr $b % $a
结果为 0
=:赋值a=$b 将把变量 b 的值赋给 a
==:相等,用于比较两个数字,相同则返回 true,[ $a == $b ] 返回 false
!=:不相等,用于比较两个数字,不相同则返回 true,[ $a != $b ] 返回 true
实例:
#!/bin/bash
a=100;
b=200;
va=`expr $a + $b`
echo "a+b:$va"
va=`expr $a - $b`
echo "a-b:$va"
va=`expr $a \* $b`
echo "a*b:$va"
va=`expr $a / $b`
echo "a/b:$va"
va=`expr $a % $b`
echo "a%b:$va"
if [ $a == $b ]
then
echo "a等于b"
else
echo "a不等于b"
fi
[root@localhost project]# ./yyt.sh
a+b:300
a-b:-100
a*b:20000
a/b:0
a%b:100
a不等于b
- 关系运算符(关系运算符只支持数字)
a=100;b=200
-eq:检测两个数是否相等,相等返回 true,[ $a -eq $b ] 返回 false
-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
实例:
#!/bin/bash
a=100;
b=200;
if [ $a -eq $b ]
then
echo "$a -eq $b : a等于b"
else
echo "$a -eq $b: a不等于b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b : a不等于b"
else
echo "$a -ne $b: a等于b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b : a大于b"
else
echo "$a -gt $b: a不大于b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b : a小于b"
else
echo "$a -lt $b: a不小于b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b : a大于等于b"
else
echo "$a -ge $b: a不大于等于b"
fi
if [ $a -le $b ]
then
echo "$a -le $b : a小于等于b"
else
echo "$a -le $b: a不小于等于b"
fi
[root@localhost project]# ./yyt.sh
100 -eq 200: a不等于b
100 -ne 200 : a不等于b
100 -gt 200: a不大于b
100 -lt 200 : a小于b
100 -ge 200: a不大于等于b
100 -le 200 : a小于等于b
- 布尔运算符
a=100;b=200
!:非运算,表达式为 true 则返回 false,否则返回 true,[ ! false ] 返回 true
-o:或运算,有一个表达式为 true 则返回 true,[ $a -lt $b -o $b -gt 1000 ] 返回 true
-a:与运算,两个表达式都为 true 才返回 true,[ $a -lt $b -a $b -gt 1000 ] 返回 false
实例:
#!/bin/bash
a=100;
b=200;
if [ $a != $b ]; then
echo " &a != $b : a不等于b"
else
echo " $a != $b : a等于b"
fi
if [ $a -le $b -a $b -ge $a ]; then
echo " $a -le $b -a $b -ge $a : true"
else
echo " $a -le $b -a $b -ge $a : false"
fi
if [ $a -ge $b -a $b -gt $a ]; then
echo " $a -ge $b -a $b -gt $a : true"
else
echo " $a -ge $b -a $b -gt $a : false"
fi
if [ $a -ge $b -o $b -gt $a ]; then
echo " $a -ge $b -a $b -gt $a : true"
else
echo " $a -ge $b -a $b -gt $a : false"
fi
if [ $a -ge $b -o $b -lt $a ]; then
echo " $a -ge $b -o $b -lt $a : true"
else
echo " $a -ge $b -o $b -lt $a : false"
fi
[root@localhost project]# ./yyt.sh
&a != 200 : a不等于b
100 -le 200 -a 200 -ge 100 : true
100 -ge 200 -a 200 -gt 100 : false
100 -ge 200 -a 200 -gt 100 : true
100 -ge 200 -o 200 -lt 100 : false
- 逻辑运算符
a=100;b=200
&&:逻辑的 AND[[ $a -lt 1000 && $b -gt 1000 ]] 返回 false
||:逻辑的 OR[[ $a -lt 1000 || $b -gt 1000 ]] 返回 true
实例:
#!/bin/bash
a=100;
b=200;
if [[ $a -le 1000 && $b -ge 1000 ]]
then
echo " $a -le 1000 && $b -ge 1000: true"
else
echo " $a -le 1000 && $b -ge 1000 : false"
fi
if [[ $a -le 1000 && $b -lt 1000 ]]
then
echo " $a -le 1000 && $b -lt 1000 : true"
else
echo " $a -le 1000 && $b -lt 1000 : false"
fi
if [[ $a -le 1000 || $b -ge 1000 ]]
then
echo " $a -le 1000 && $b -ge 1000 : true"
else
echo " $a -le 1000 && $b -ge 1000 : false"
fi
if [[ $a -ge 1000 && $b -gt 1000 ]]
then
echo " $a -ge 1000 && $b -gt 1000 : true"
else
echo " $a -ge 1000 && $b -gt 1000 : false"
fi
[root@localhost project]# ./yyt.sh
100 -le 1000 && 200 -ge 1000 : false
100 -le 1000 && 200 -lt 1000 : true
100 -le 1000 && 200 -ge 1000 : true
100 -ge 1000 && 200 -gt 1000 : false
- 字符串运算符
a=100;b=200
=:检测两个字符串是否相等,相等返回 true,[ $a = $b ] 返回 false
!=检测两个字符串是否相等,不相等返回 true,[ $a != $b ] 返回 true
-z检测字符串长度是否为0,为0返回 true,[ -z $a ] 返回 false
-n检测字符串长度是否为0,不为0返回 true,[ -n $a ] 返回 true
str检测字符串是否为空,不为空返回 true,[ $a ] 返回 true
实例:
#!/bin/bash
a="abcd"
b="efgh"
if [ $a = $b ]
then
echo "$a = $b :a等于b"
else
echo "$a = $b :a不等于b"
fi
if [ $a != $b ]
then
echo "$a != $b :a不等于b"
else
echo "$a != $b :a等于b"
fi
if [ -z $a ]
then
echo "-z $a :字符串a长度为0"
else
echo "-z $a :字符串a长度不为0"
fi
if [ -n $a ]
then
echo "-n $a :字符串a长度不为0"
else
echo "-n $a :字符串a长度为0"
fi
if [ $a ]
then
echo "$a :字符串不为空"
else
echo "$a :字符串a为空"
fi
[root@bogon project]# ./yyt.sh
abcd = efgh :a不等于b
abcd != efgh :a不等于b
-z abcd :字符串a长度不为0
-n abcd :字符串a长度不为0
abcd :字符串不为空
- 文件测试运算符
-b file:检测文件是否是块设备文件,如果是,则返回 true,[ -b $file ] 返回 false
-c file:检测文件是否是字符设备文件,如果是,则返回 true,[ -c $file ] 返回 false
-d file:检测文件是否是目录,如果是,则返回 true,[ -d $file ] 返回 false
-f file:检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true,[ -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
-s file:检测文件是否为空(文件大小是否大于0),不为空返回 true,[ -s $file ] 返回 true
-e file:检测文件(包括目录)是否存在,如果是,则返回 true,[ -e $file ] 返回 true
#!/bin/bash
file="/myshell/project/wy.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
if [ -f $file ]
then
echo "文件是普通文件"
else
echo "文件不是普通文件"
fi
if [ -d $file ]
then
echo "文件是个目录"
else
echo "文件不是个目录"
fi
if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi
[root@bogon project]# ./yyt.sh
文件可读
文件可写
文件可执行
文件存在
文件是普通文件
文件不是个目录
文件不为空
4、shell echo命令
1、echo输出普通字符串
- eg:echo it is a test等于echo “it is a test”
it is a test
2、显示转义字符
- eg:echo \" it is a test\"
"it is a test"
3、显示变量
- eg: #!/bin/bash
p=good
echo “i am a $p man” `
[root@bogon project]# ./yyt.sh
i am a good man
- eg:#!/bin/bash
- read p
-echo “$p is a good man” `
[root@bogon project]# ./yyt.sh
yyt
yyt is a good man
4、显示换行
- eg:#!/bin/bash
echo -e “yyt is a good man \n”
echo “he is a good person”
[root@bogon project]# ./yyt.sh
yyt is a good man
he is a good person
5、显示不换行
- eg:#!/bin/bash
echo -e “yyt is a good man \c”
echo “he is a good person”
[root@bogon project]# ./yyt.sh
yyt is a good manhe is a good person
6、显示结果定向至文件
eg:#!/bin/bash
echo “It is a test” > test
[root@bogon project]# ./yyt.sh
[root@bogon project]# cat test
It is a test
7、原样输出字符串,不进行转义或取变量(用单引号)
#!/bin/bash
echo ‘$name"’
$name\"
8、显示命令执行结果
#!/bin/bash
a=1
b=3
echo expr $a + $b
[root@bogon project]# ./yyt.sh
4