LINUX SHELL脚本

1.SHELL简介

1.1什么是shell

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

SHELL是用户与 Linux沟通的桥梁

使用SHELL脚本可以完成更复杂的系统管理工作

1.2当前主流操作系统的SHELL

windows系统:dos系统(使用dos系统可以编写批处理命令)

Linux系统: Bourne Again Shell,简称Bash

1.3编写shell脚本的步骤

1.创建以.sh为扩展名的文件

2.编辑脚本文件

编辑脚本要注意的内容:

  • 第一行以“#!”开头,声明所使用的shell的全路径
  • 注释,以“#”开头

3.增加脚本文件执行权限

chmod +x 脚本名字,所有用户均对该脚本有执行权限

chmod 755 脚本名字,用户所有者对该脚本具有完全的权限,其他人对改脚本具有执行权限

4.运行脚本文件

  进入脚本文件目录:cd /home/script

  方式一  ./ 脚本名   :./hello.sh

  方式二  /bin/sh 脚本名

2.SHELL变量

2.1定义变量

定义变量时,变量名不加$,变量名和等号之间不能有空格,如:

your_name="runoob.com"

变量名命名规则:

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

myname='galley'   #单引号,字符串类型,不解析任何字符

courses="abcdefg"  #双引号,内部会解析$和反斜杠特殊字符

sum=100;price=1.2544  #如果是数字,可以不加引号

now_date=`date`   #反引号执行系统命令

2.2使用变量

使用一个定义过的变量,只要在变量名前面加 $ 即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done
ubuntu@VM-0-12-ubuntu:~$ testvar=100
ubuntu@VM-0-12-ubuntu:~$ echo 'the value is $testvar'
the value is $testvar
ubuntu@VM-0-12-ubuntu:~$ echo "the value is $testvar"
the value is 100
ubuntu@VM-0-12-ubuntu:~$ now_date=`date`
ubuntu@VM-0-12-ubuntu:~$ echo $now_date
Mon Apr 19 18:02:17 CST 2021

2.3环境变量、局部变量与预定义变量 

环境变量

一般指在操作系统中用来指定操作系统运行环境的一些参数,如PATH、PWD、USER、当前使用的SHELL名称等。

常见的环境变量:

  • PATH:系统路径
  • HOME:当前用户家目录
  • HISTSIZE:保存历史命令记录的条数
  • LOGNAME:当前用户登录名
  • HOATNAME:主机名称
  • SHELL:当前用户用的是哪种shell
  • LANG/LANGUGE:和语言相关的环境变量,使用多种语言的用户可以修改此环境变量
  • MAIL:当前用户的邮件存放目录

查看环境变量

  • env:显示所有的环境变量
  • echo $PATH:显示某一个环境变量的值

局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

预定义变量 

预定义变量和环境变量相类似,也是在Shell一开始时就定义了的变量。所不同的是,用户只能根据Shell的定义来使用这些变量,而不能重定义它。所有预定义变量都是由$符和另一个符号组成的,常用的Shellf预定义变量有:

  • $#            位置参数的数量
  • $*             所有位置参数的内容
  • $?            命令执行后返回的状态  #0表示成功,非O表示失败
  • $$            当前进程的进程号
  • $!             后台运行的最后一个进程     #很少用,了解即可
  • $0            当前执行的进程名

如:

cat predefine_var.sh# !/bin/sh
#!/bin/sh
echo "这个程序的名字:$0"
echo "参数的数量:$#"
echo "所有的参数:$*"
echo "当前进程号:$$”

2.4脚本的输入和输出

echo输出

echo string
  • -e :识别输出内容里的转义序列
  • -n :忽略结尾的换行
echo "It is a test"  #显示普通字符串,结果:
echo "\"It is a test\""  #显示转义字符,结果:"It is a test"
read name 
echo "$name It is a test" #显示变量
echo -e "OK! \n" # -e 开启转义
echo "It is a test"   #换行显示
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"  #显示不换行,结果:OK! It is a test
echo "It is a test" > myfile  #显示结果定向至文件
echo '$name\"' #原样输出字符串,不进行转义或取变量(用单引号),结果:$name\"
echo `date` #显示命令执行结果

printf输出

printf  format-string  [arguments...]
  • format-string: 为格式控制字符串
  • arguments: 为参数列表

①默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n;

printf的转义序列:

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

②printf支持格式化输出

%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。

%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

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

举例:

ubuntu@VM-0-12-ubuntu:~$ vim test.sh

#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 58.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
~                                                

结果:

 

read输入

read 命令读取标准输入设备的下一行,标准输入中的新一行到换行符前的所有字符会被读取,并赋值给对应的变量。可以结合echo一起实现读取并输出的功能。

ubuntu@VM-0-12-ubuntu:~$ echo "please input your ipaddress"
please input your ipaddress
ubuntu@VM-0-12-ubuntu:~$ read ipaddr
192.168.1.1
ubuntu@VM-0-12-ubuntu:~$ echo "my ip address is $ipaddr"
my ip address is 192.168.1.1

<<按行输入

“<<”可以被认为是一种重定向符,重定向脚本文件中的一行作为到一个命令的输人。

操作符<<被放在输入重定向的命令之后,紧跟在<<的各行作为命令的输入,输入的结尾通过文件结束符(ctrl+D)表示,也可以自己定义定界符,定界符后的单词作为输入各行结束的定界符。

注意结束时的定界符一定要顶格写。

例如:自动连接ftp服务器来下载数据

#!/bin/sh
#演练用"<<"按行输入来上传下载文件
ftpserver=192.168.1.100
rq= `date +%Y%m%d
cd /home/liu/mydocs
ftp -i -n<

3.SHELL操作

3.1运算操作

1.let整数运算

let 命令让BASH shell执行算数值的操作,使用let,可以比较两个值或执行加减乘除等操作,这种操作经常用于shell程序中的控制流程结构或执行需要的运算,注意let命令只能执行整数的相关运算,运算结果也只能保存整数。使用方法如下:

let 变量名 = 变量1 运算符 变量2

常见的算数操作分类:

  • 加法:+
  • 减法:-
  • 乘法:*
  • 除法:/
  • 取余数:%

注意,和c语言类似,let i=$i+1也可以写成let i++,从而简化书写。

i=10
j=20
k=3
let r1=$i+$j+$k
let r2=$j-$i-$k
let r3=$i*$j*$k
let r4=$j*$k/$i
#输出运算结果
echo "i+j+k=$r1"
echo "j-i-k=$r2"
echo "i*j*k=$r3"
echo "j*k/i=$r4"

expr

3.2比较操作

你可能感兴趣的:(操作系统)