shell介绍

Shell通常指的是命令行界面的解析器,也用于泛指所有为用户提供操作界面的程序,也就是程序和用户交互的层面。

Shell 执行shell程序,这些程序叫脚本。

创建脚本使用文本编辑器来创建包含指令的文件,这里使用vim

1
2
3
4
5
6
7
8
9
10
11
$ vim bash.sh
#!/bin/bash ##创建脚本文件时候必须在文件第一行指明要用到的shell
for file in * #以#开头的行不会被shell处理
do
if grep -q POSIX $file
then
echo $file
fi
done

exit 0

把脚本设置为可执行,

1、

1
$ /bin/bash bash.sh
1
2
$ chmod +x bash.sh						##改变文件权限,使这个文件可以被所有用户执行
$ ./bash.sh

Shell 语法

变量

所有变量都被看作字符串并以字符串来存储.

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:(变量名称使用小写英文命名,因为系统中的全局变量是大写命名的,为防止重复定义就用小写)

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。

在shell中,可以通过在变量名前加上$符号来访问它的内容, 一种检查变量内容的简单方式就是变量前加上$再用echo命令将它的内容输出到终端。

1
2
3
4
5
 salutation=Hello
echo $salutation
echo salutation
Hello
salutation

read可以给变量复制相当于C语言的input

1
2
3
4
 read salutation
echo $ salutation
sa
sa

要想输出空格需要用双引号给引用出来,要想显示双引号可,以用单引号来显示出来,在显示信息中想要有美元符号,必须在前面加上\

变量每次被引用时,都会输出当前赋给它的值。重要的是要记住,引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符。

可以通过`反引号来将命令输出赋值给变量或者$()

1
2
$ testing = `date`
$ testing = $(date)

使用 unset 命令可以删除变量。

变量类型

运行shell时,会同时存在三种变量:

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

Shell数组

bash支持一维数组,并且没有限制大小。

1
数组名=(值1 值2 ... 值n)	#例如这样array_name=(value0 value1 value2 value3)
读取数组
1
${数组名[下标]}							#例如echo ${array_name[@]}
获取数组长度
1
2
3
4
5
6
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

bash shell脚本不支持浮点型运算,只支持整数运算,如果想要计算可用bash的计算器bc

流程控制

if

1
2
3
4
5
6
7
if condition
then
command1
command2
...
commandN
fi

if -else

1
2
3
4
5
6
7
8
9
if condition
then
command1
command2
...
commandN
else
command
fi

if else-if else

1
2
3
4
5
6
7
8
9
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

如果使用 ((…)) 作为判断语句,大于和小于可以直接使用 > 和 <

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a=10
b=20
if (( $a == $b ))
then
echo "a 等于 b"
elif (( $a > $b ))
then
echo "a 大于 b"
elif (( $a < $b ))
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi

for循环

1
2
3
4
5
6
7
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。in列表是可选的,如果不用它,for循环使用命令行的位置参数。

顺序输出当前列表中的数字:

1
2
3
4
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done

while循环

1
2
3
4
while condition
do
command
done

until 循环

until 循环执行一系列命令直至条件为 true 时停止。condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环

1
2
3
4
until condition
do
command
done

case… esac

case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac

和C语言一样break用来跳出所有循环,continue是用来跳出当前循环。

test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

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

eg:

1
2
3
4
5
6
7
8
9
#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi

文件测试

参数 说明
-e文件名 如果文件存在则为真
-f文件名 如果文件存在且可读则为真
-w文件名 如果文件存在且可写则为真
-x文件名 如果文件存在且可执行则为真
-s文件名 如果文件存在且至少有一个字符则为真
-d文件名 如果文件存在且为目录则为真
-f文件名 如果文件存在且为普通文件则为真
-c文件名 如果文件存在且为字符型特殊文件则为真
-b文件名 如果文件存在且为块特殊文件则为真
1
2
3
4
5
6
7
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi

shell函数

1
2
3
4
5
6
7
8
[ function ] funname [()]
{

action;

[return int;]

}
  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

传参

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
参数处理 说明
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。