shell是一种程序设计语言,是访问操作系统内核的服务。

Linux的shell种类常见的有:

Bourne Shell(/usr/bin/sh或/bin/sh)

Bourne Again Shell(/bin/bash)

C Shell(/usr/bin/csh)

K Shell(/usr/bin/ksh)

Shell for Root(/sbin/sh)

Shell脚本执行的两种方法

./shell.sh 根据shell脚本第一行指定的shell执行

/bin/sh test.sh 根据命令行中指定的shell执行

/bin/php test.php

 shell变量

定义变量:your_name="runoob.com"              for file in `ls /etc`

使用变量:echo $your_name   echo ${your_name}  echo "I am good at ${skill}Script"

删除变量:unset variable_name

变量类型

1)局部变量

2)环境变量

3)shell变量

shell字符串

单引号:str='this is a string'

双引号:

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"

拼接字符串:

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

获取字符串长度:

string="abcd"
echo ${#string} #输出 4

提取子字符串:

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串:

string="runoob is a great company"
echo `expr index "$string" is` # 输出 8

Shell数组

bash支持一维数组,不支持多维数组,并且没有限定数组的大小

定义数组::数组名=(值1 值2 ... 值n) array_name=(value0 value1 value2 value3)

或array_name[0]=value0

array_name[1]=value1
array_name[n]=valuen

读取数组:${数组名[下标]}  valuen=${array_name[n]}

使用@符号可以获取数组总的所有元素:echo ${array_name[@]}

获取数组的长度:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

 Shell传递参数

我们在执行shell脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推。

例子:

#!/bin/bash

echo "shell 传递参数实例!";

echo "执行的文件名为:$0";

echo "第一个参数为:$1";

echo "第二个参数为:$2";

echo "第三个参数为:$3";

执行结果

./test.sh 1 2 3

shell 传递参数实例!

执行的文件名:./test.sh

第一个参数为:1

第二个参数为:2

第三个参数为:3

另外,还有几个特殊字符用来处理参数

参数说明 说明
$# 传递到脚本的参数个数
$*

以一个单字符显示所有向脚本传递的参数。

如"$*"用["]括起来的情况,以"$1 $2 $3"的形式输出所有参数。

$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@

与$*相同,但是使用时加引号,并在引号中返回每个参数。

如"$@"用["]括起来的情况,以"$1""$2""$3"..."$n"的形式输出所有参数

$- 显示shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

例子:

#!/bin/bash

echo "Shell传递参数实例!";

echo "第一个参数为:$1";

echo "参数个数为:$#";

echo "传递的参数个数作为一个字符串显示:$*";

执行脚本,结果如下:

./test.sh 1 2 3

Shell传递参数实例!

第一个参数为:1

参数个数为:3

传递的参数个数作为一个字符串显示:1 2 3

$*与$@的区别

相同点:都是引用所有参数

不同点:只有在引号中体现出来。假设脚本运行时写了是哪个参数1、2、3,则"*"等价于"1 2 3"(传递了一个参数),而"@"等价于"1""2""3"(传递了三个参数)。

#!/bin/bash

echo "-- \$* 演示"

for i in "$*";do

  echo $i

done

echo "--\$@ 演示"

for i in "$@";do

  echo $i

done

执行脚本,结果如下所示

./test.sh 1 2 3

--$* 演示--

1 2 3

--$@ 演示--

1

2

3

Shell数组

Shell数组用括号来表示,元素用“空格”符号分割开。

Shell运算符

expr是一款表达式计算工具,使用它能完成表达式的求值操作。

val=`expr 2 + 2`;

echo "两数之和为:$val";

两点注意:表达式和运算符之间要有空格,例如2+2是不对的,必须写成2 + 2,这与我们熟悉的大多数编程语言不一样。

完整的表达式要被``包含,注意这个字符不是常用的单引号,在Esc键下边。

算数运算符

 
运算符 说明 举例
+ 加法 `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

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

运算符 说明 举例
-eq 检测两个数是否相等,相等返回true [$a -eq $b]返回false
-ne 检测两个数是否相等,不相等返回true [$a -nq $b]返回true
-gt 检测左边的数是否大于右边的,如果是,则返回true [$a -gt $b]返回false
-lt 检测左边的数是否小于右边的,如果是,则返回true [$a -lt $b]返回true
-ge 检测左边的数是否大于等于右边的,如果是,则返回true [$a -qe $b]返回false
-le 检测左边的数是否小于等于右边的,如果是,则返回true [$a -le $b]返回true

布尔运算符

运算符 说明 举例
! 非运算,表达式为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

逻辑运算符

运算符 说明 举例
&& 逻辑与AND [[$a -lt 100 && $b -gt 100]]返回false
|| 逻辑或OR [[$a -lt 100 || $b -gt 100]]返回true
     

字符串运算符

a="abc" b="efg"

运算符 说明 举例
= 检测连个字符串是否相等,相等返回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

文件测试运算符

变量file表示文件"/var/www/runoob/test.sh",它的大小为100字节,具有rw权限。下面的代码,将检测该文件的属性。

操作符 说明 举例
-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

Shell echo命令

1、显示普通字符串

echo "It is a test"

这里的双引号完全可以省略,以下命令与上面实例效果一致:

echo It is a test

2、显示转义字符

echo "\"It is a test\""

结果将是

"It is a test"

3、显示变量

#!/bin/bash

read name

echo "$name It is a test"

name接收标准收入的变量,结果将是:

sh test.sh

OK     #标准输入

OK It is a test   #输出

4、显示换行

echo -e "OK! \n"   #-e 开启转义

echo "It is a test"

输出结果

OK!

It is a test

5、显示不换行

#!/bin/bash

echo -e "OK! \c"  #-e 开启转义 \c不换行

echo "It is a test"

输出结果

OK! It is a test

6、显示结果定向至文件

echo "It is a test" > myfile

7、原样输出字符串,不进行转义或取变量(用单引号)

echo '$name\"'

输出结果

$name\"

8、显示命令执行结果

echo `date`

结果将显示当前日期

Mon Dec 12 18:33:04 UTC 2016

 Shell printf命令

printf跟echo类似,但是可以制定字符串的宽度、左右对齐方式等。

printf format-string [arguments...]

实例:

printf "Hello, Shell\n"

实例:

#!/bin/bash

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg

printf "%-10s %-8s %-4.2f\n"郭靖 男 66.1234

printf "%-10s %-8s %-4.2f\n"杨过 男 48.6543

结果

姓名 性别 体重kg

郭靖 男 66.12

杨过 男 48.65

解释:%-4.2f指格式化为小数,其中.2指保留2位小数

更多实例

#format-string为双引号

printf "%d %s\n" 1 "abc"

#单引号与双引号效果一样

printf '%d %s\n' 1 "abc"

#没有引号也可以输出

printf %s abcdef

#格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string被重要

printf %s abc def

printf "%s\n" abc def

printf "%s %s %s\n" a b c d e f g h i j

#如果没有arguments,那么%s用NULL代替,%d用0代替

printf "%s and %d \n"

执行结果

1 abc

1 abc

abcdefabcdefabc

def

a b c

d e f

g h i

j

and 0

printf的转义序列

序列 说明
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符

Shell test命令

数值测试

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

实例演示

num1=100

num2=100

if test $[num1] -eq $[num2]

then

  echo '两个数相等!'

else

  echo '两个数不相等!'

fi

输出结果

两个数相等!

字符串测试

参数 说明
= 等于则为真
!= 不相等则为真
-z字符串 字符串的长度为零则为真
-n字符串 字符串的长度不为零则为真

实例演示

num1="ru1noob"

num2="runoob"

if test $num1 = $num2

then

  echo '两个字符串相等!'

eles

  echo '两个字符串不相等'

fi

输出结果

两个字符串不相等

文件测试

参数 说明
-e文件名 如果文件存在则为真
-r文件名 如果文件存在且可读则为真
-w文件名 如果文件存在且可写则为真
-x文件名 如果文件存在且可执行则为真
-s文件名 如果文件存在且至少有一个字符则为真
-d文件名 如果文件存在且为目录则为真
-f文件名 如果文件存在且为普通文件则为真
-c文件名 如果文件存在且为字符型特殊文件则为真
-b文件名 如果文件存在且为块特殊文件则为真

实例演示

cd /bin

if test -e ./bash

then

  echo '文件已存在'

else

  echo '文件不存在'

fi

输出结果

文件已存在!

另外,Shell还提供了与(-a)、或(-o)、非(!)三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:

cd /bin

if test -e ./notFile -o -e ./bash

then

  echo '有一个文件存在!'

else

  echo '两个文件都存在'

fi

输出结果

有一个文件存在

最新文章

  1. java-关于浏览器的判断
  2. iOS:后台定位并实时向服务器发送位置
  3. JS实现电子时钟
  4. Delphi XE5教程3:实例程序
  5. android150 笔记
  6. GCC内联汇编入门
  7. MySQL 指定数据库字符集的 3 种方法。
  8. 关于malloc和free函数的用法
  9. 关于NOMINMAX这个预处理宏
  10. Python Face Detect Offline
  11. 分分钟解决MySQL查询速度慢与性能差
  12. MD5加密加盐
  13. kubernetes 基础命令及操作
  14. mysql 之库, 表的简易操作
  15. VUE项目实现页面跳转
  16. dev 域名与 Chrome
  17. 朴素贝叶斯文本分类(python代码实现)
  18. redis集群的ruby环境
  19. 排序算法(10)--Distribution Sorting--分布排序[2]--Radix Sort--基数排序
  20. table中怎么设置两行间距

热门文章

  1. sqlserver中根据表中的配置概率取到数据
  2. python排序之一插入排序
  3. js入门学习~ 运动应用小例
  4. springMVC异常&&重定向&&转发
  5. 【IDEA】intellij idea 插件推荐
  6. svn cleanup 执行失败时,可以勾选 break locks,
  7. 解读ASP.NET 5 & MVC6系列(13):TagHelper
  8. [LeetCode] Basic Calculator 基本计算器
  9. 分分钟带你玩转 Web Services
  10. 攻城记:Thinkphp框架的项目规划总结和踩坑经验