linux shell脚本编程学习(一)基础

时间:2022-08-03 15:36:49

1.使用多个命令

在linux中如果想要两个命令一起运行,则在中间使用分号分割开:

如下

# date ; who

则会先运行date命令打印出当前时间,在运行who命令打印出当前登陆在系统中的用户。


2.创建shell脚本

创建shell脚本需要在本文的第一行输入#!/bin/bash,“#!”后面跟着的shell代表要使用的shell,也可以指定为其他shell。只有在第一行#后面跟感叹号是用于解释使用哪种shell的,其他行如果使用#开头,则表示注释说明。

如下

#!/bin/bash

#This script displays the date and who's logged on

date

who

这个shell就算完成了,运行后会输出当前时间和当前登陆在系统中的用户。

不过在运行前先要修改下这个脚本的权限,譬如该脚本的名称为first.sh,那可以执行以下命令为该脚本赋予可执行权限。

#chmod 755 first.sh

接着再执行即可,如果该脚本在当前目录下,需使用./开头来执行,如下

# ./first.sh


3 显示消息

如果想让shell输出些内容显示在控制台上,可以使用echo命令。用法如下:

运行以下命令

#echo this is a test

会输出:this is a test

一般情况下,不需要使用单引号或者双引号将需要输出的内容引起来,但是如果输出的内容中含有单引号或者双引号,则用另一种引号在外面引起来。

#echo "This is a test to see if you're paying attention"

将会输出:This is a test to see if you're paying attention

或者

#echo 'Rich says "scripting is easy".'

将会输出:Rich says "scripting is easy".


另外,脚本中的 -n 参数可以将两行输出的内容显示成一行。

如下脚本:

#!/bin/bash

echo -n "The time and date are:"

date

运行此脚本,会输出

The time and date are:Sat Jan  3 06:50:19 PST 2015


4 变量

4.1环境变量

shell维护着一组环境变量,例如登录在系统中的用户名,用户的系统ID等,这些环境变量的使用可以在变量名称前加$符号来使用。
如下:
#!/bin/bash
echo "User info for userid:$USER"
echo UID:$UID
会输出:
User info for userid:root
UID:0
使用变量可以放在引号中输出也可以不放,但是如果你想要输出一个$符号,而不是作为一个变量,需要在$符号前加上“\”反斜线。如echo “\$15” 会输出 $15,不加反斜线的话它会吧$1当作一个变量去寻找,找不到的话就只会输出5.


4.2 用户变量

用户可以在脚本中自己定义变量,使用的时候和环境变量一样,需要在变量名前加上$符号。

如下:

#!/bin/bash

value1=10

value2="20"

value2=$value1
echo the first value is $value1
echo the second value is $value2
会输出:
the first value is 10
the second value is 10
这里需要记住,需要使用变量的值的时候前面需要加上$符号,而对一个变量赋值时,则不需要,如以上shell的第四行。


4.3 反引号

反引号不同于一般常用的单引号,反引号的键盘位置位于和~同一个键位,它的使用方式是在反引号里面的命令输出的内容可以保存在变量上。

如下:

#!/bin/bash

now=`date`

echo the time is $now

运行以上命令,会把date命令的输出结果保存到now变量中,然后再输出。


5 重定向输入输出

5.1 输出重定向

输出重定向用于将命令输出的内容输出到一个文件中去,输出命令是 > ,前面是命令,后面是输入到的文件,没有的话会默认新建一个文件。

如下:

ls -l > a.txt

将会把当前目录下的文件详细信息输入到a.txt当中,如果是想在文件中追加的话,则写两遍输出命令即可,“>>”。

5.2输入重定向

输入重定向和输出重定向相反,输入重定向命令是<,前面依然是命令,后面是文件,作用是把文件的内容应用在前面命令上,然后输出结果。
如下:
grep test1.sh < a.txt
该命令会输出内容中有test1.sh的那行,如果有多行都有,就会输出多行。
还有另外一种输入重定向的方法,叫做内联输入重定向,命令是“<<”这种方法允许你在命令行输入重定向的数据(不是指定的文件中的数据),但是需要在输入的开头和结尾指定一个文本标记来划分,开头和结尾指定的标记需一致。
如下:
grep tianqi << marker
输入完此命令之后敲回车,会提示你输入需要重定向的数据,每输入完敲一次回车代表本行输入完,继续输入下一行,直到输入和开头标记一样的结束标记。
>tianqi bucuo
>test
>tianqi zhen bucuo
>marker      (这里需和开头指定的文本标记一样)
运行之后会输出:
tianqi bucuo
tianqi zhen bucuo


6 执行数学运算

6.1 expr 命令

expr命令允许你执行一些算术的运算,包括加,减,乘,除,取余,比较运算等。

如下:
expr 1 + 5
运行上面的命令输出6(expr后面的数字和运算符以及第二个数字之间要有空格)


expr 9 / 5
运行以上命令9除以5会输出1,这是因为expr表达式只支持整数,不支持浮点数,运算后的结果如果是带有浮点的,会自动向下取整,所以结果是1.


expr 5 * 10
运行这个的话,结果会有一个错误如下:
expr:syntax error
因为*在shell中代表特殊含义,所以使用乘法的时候,这里需要使用“\”进行转义。
expr 5 \* 10
这样就会正确输出50.


操作符有这些: <<==!=>= > 这几个是符合这些条件的返回1,否则返回0.(这里的<  <=  >=  >这几个符号也需要转义才能使用)+ —*/% (取余)

6.2 使用方括号

另外在bash shell中提供了另一种执行算术运算的方法,使用起来更方便一些,例如下面的shell脚本。

#!/bin/bash
var=$[1+5]
echo $var
运行上面的脚本,结果会输出6,很简单吧!只需要在$[ ]当中进行运算即可,另外使用方括号的方法,在进行expr运算中转义的才能运算的时候在这里不需要转义。


6.3 浮点解决方案(bc)

bc计算器是内建的bash计算器,称作bc。

bc计算器可以输入浮点的表达式,可以计算出结果。

用法如下:

在命令行输入bc之后,敲回车会进入bc计算器,在这里输入

12.2*3

输出36.6,由此可见bc计算器是支持浮点表达式的。

输入

13.4/5

输出2,这里自动变为整数了。

在bc中使用除法的时候,需要设置一个内建的称为scale的变量来控制,默认为0,则是值保留0为小数,自然就是整数。

如下:

$ bc -q

scale=2

13.4/5

2.68

quit

$

由此可见,当设置scale变量为2时,再计算浮点运算的除法,会保留两位小数,quit命令是退出,bc后面的-q参数代表不输出欢迎提示(手动实现下就会知道)。


如何在脚本中使用bc呢?
如下的脚本是使用了bc的例子
#!/bin/bash
var1=`echo "scale=4; 13.4 / 5" | bc `
echo the result is $var1
执行以上脚本就会输出:the result is 2.6800
解释一下:上面的“|”叫做管道命令,它会把“|”前面的命令的结果,拿到它后面的命令上作为输入执行,最后把这条命令的输出结果赋值给var1变量。(不太懂管道命令的可以在网上找下资料详细了解下)。

7 退出脚本

在linux中运行完每个命令之后都使用一个退出状态码(exit status)来告诉shell完成来处理,退出状态码是一个0~255的整数值,一个成功结束的命令的退出状态码是0,如果一个命令结束时有错误,退出状态码为非0的其他整数。

一般linux退出状态码如下:
0命令成功结束
1通用未知错误
2误用shell命令
126命令不可执行
127没找到命令
128无效退出参数
130命令通过Ctrl+C终止
255退出状态码越界


$?这个变量可以使我们查看上一个命令的结束状态码。
譬如我们先运行date命令,之后再运行echo $? 命令,会输出0.
另外,我们自己的shell脚本也可以指定一个退出状态码,使用exit命令 ,后面跟上 状态码的数字即可(如:exit 5),但必须是0~255的整数。如果不指定的话,则会默认使用你脚本当中的最后一个命令的退出状态码作为你的脚本退出状态码。