shell

     2019年12月14日 shell  笔记

编译语言分类
1、编译语言
执行之前需要专门的编译过程,运行时不需要编译,执行效率高、依赖编译器、跨平台性差(例:c c++)
2、解释语言
程序不需要编译,程序运行时解释器翻译成机器语言,执行一次,翻译一次,效率低(例:Python、javaScript\shell)
Shell
shell是一个命令行解释器,接收应用程序、用户命令,然后调用操作系统内核。是功能相当强大的编程语言,易编写、易调试、灵活性强。

概括:shell是一个基于linux内核和应用程序之间的一个解释器
Shell解析器
(1)Liunx提供的解析器有:
[heyali@jinghang ~]$ cat /etc/shells
/bin/sh 是bash的一个快捷方式
/bin/bash 目前多用的是bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
(2)bash和sh的关系
[heyali@jinghang ~]$ cd /bin
[heyali@jinghang bin]$ ll | grep bash
-rwxr-xr-x. 1 root root 942200 3月 23 2017 bash
lrwxrwxrwx. 1 root root 4 12月 11 20:10 sh -> bash
软连接指向bash,两个是同一种
(3)Centos默认的解析器是bash
[heyali@jinghang bin]$ echo $SHELL
/bin/bash
Shell脚本入门
脚本是将需要执行的命令保存到文本中,按照顺序执行,他是解释型的,不需要编译
1、脚本格式
2、脚本以#!/bin/bash开头(指定解析器)
#!/bin/bash
#添加描述信息
#Name:谁编写的脚本
#DESC:脚本的描述,作用是什么
#PATH:路径(脚本的路径)
#CREATETIME:创建日期
#UPATETIME:更新日期
实例:
创建一个shell脚本:
1.删除class21下的test文件夹
2.在class21新建一个文件夹test2,在test2中创建3个子文件夹dir1,dir2,dir3
3.在dir2中新建一个文件student.txt
4.在student.txt中添加一个zhangsan
5.打印“任务执行完毕,2019-12-14 09:32:00”

1、编写脚本:
1.#!/bin/env bash 或者 #!/bin/bash
2.添加脚本的描述信息(姓名、描述、路径、创建日期、更新日期等)
3.开始写脚本
[root@jinghang ~]# mkdir class21
[root@jinghang ~]# cd class21/
[root@jinghang class21]# ll
总用量 0
[root@jinghang class21]# vim shell.sh

#!/bin/env bash

1.删除class21下的test文件夹 # 创建class21/test文件 mkdir -p root/class21/test # 删除

rm -rf /root/class21/test

2.新建在class21新建一个文件夹test2,在test2中创建3个子

文件夹dir1,dir2,dir3
mkdir -p /root/class21/test2/dir{1…3}

3.在dir2中新建一个文件student.txt

进入dir2

cd /root/class21/test2/dir2

添加student.txt文件

touch student.txt

4.在student.txt中添加一个zhangsan

echo “张三” >> student.txt

5.打印“任务执行完毕,2019-12-14 09:32:00"

echo "任务执行完毕 date "+%Y-%m-%d %H:%M:%S""

#!/bin/env bash
rm -rf /root/class21/test
mkdir -p /root/class21/test2/dir{1…3}
cd /root/class21/test2/dir2
touch student.txt
echo “zhangsan” >> student.txt
echo "任务执行完毕 date "+%Y-%m-%d %H:%M:%S""

执行方式:
3、脚本常用执行方式
第一种:采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)
不建议的执行方法:
[root@jinghang class21]# bash shell01.sh
任务执行完毕 2019-12-14 15:22:48

第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x,推荐采用这种方式)

注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

执行脚本:
bash + 相对路径
bash + 绝对路径
sh + 相对路径
sh + 绝对路径
source + 绝对路径

			推荐的执行方式:(相对路径、绝对路径执行)
				1.为脚本添加可执行的权限
					chmod +x 脚本名称.sh

首先要赋予helloworld.sh 脚本的+x权限

[root@jinghang class21]# chmod +x shell01.sh
[root@jinghang class21]# ll
总用量 12
-rwxr-xr-x. 1 root root 212 12月 14 15:20 shell01.sh
-rwxr-xr-x. 1 root root 204 12月 14 15:00 shell.sh
drwxr-xr-x. 2 root root 4096 12月 14 15:27 test

				2.相对路径(在脚本所在的文件夹下)
					./脚本名称.sh

[root@jinghang class21]# ./shell01.sh
任务执行完毕 2019-12-14 15:28:35
[root@jinghang class21]# ll

				3.绝对路径执行
					/root/class21/脚本名称.sh
          [root@jinghang class21]#  /root/class21/shell01.sh

任务执行完毕 2019-12-14 15:52:58

				注意:
					脚本中的第一行,指明解释器,一定不要写错
					
		扩展命令
		bash -n 脚本名称.sh  #查找脚本的语法错误
		bash -x 脚本名称.sh  #查看脚本的执行过程  

Shell中的变量
变量:临时保存变量,可变化数据
系统变量
1、常用系统变量
H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER等
(1)查看系统变量的值
[root@jinghang ~]# echo $HOME
/root
(2)显示当前Shell中所有变量:set
[root@jinghang ~]# set
BASH=/bin/bash
2、自定义变量
基本语法:
(1)定义变量 : 变量=值(不能有空格)
作用域:只针对当前用户和当前会话有效
(2)撤销变量 : nuset 变量
(3)声明静态变量 : readonly 变量 (不能 nuset)

变量定义:
(1)可以由字母、数字和下划线组成,不能以数字开头,环境变量名建议大写
(2)等号两边不能有空格
(3)在bash中,变量默认类型是字符串类型,无法直接进行数值运算
(4)变量的值如果有空格,需要使用双引号或单引号或起来
echo $a 或者 echo ${a} #读取变量
创建系统的环境变量(作用域:对所有会话的所有用户有效)
1.vim /etc/profile
2.创建变量
export 变量名(大写)=变量的值
3.激活
source /etc/profile
export(全局环境变量)作用域:只针对当前会话的所有用户有效

实例:
定义变量A
[root@jinghang ~]# A=5
[root@jinghang ~]# echo $A
5
给变量A重新赋值
[root@jinghang ~]# A=10
[root@jinghang ~]# echo $A
10
撤销变量A
[root@jinghang ~]# echo $A
10
[root@jinghang ~]# unset A
[root@jinghang ~]# echo $A
声明静态的变量B=2,不能unset
[root@jinghang ~]# readonly B=2
[root@jinghang ~]# echo $B
2
[root@jinghang ~]# B=9
bash: B: readonly variable
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
[root@jinghang ~]# C=1+2
[root@jinghang ~]# echo $C
1+2
变量的值如果有空格,需要使用双引号或单引号括起来
[root@jinghang ~]# D=I aa zhangsan
bash: aa: command not found
[root@jinghang ~]# D=“aa zhangsan”
[root@jinghang ~]# echo $D
aa zhangsan
可把变量提升为全局环境变量,可供其他Shell程序使用
export 变量名
[root@jinghang ~]# vim a.sh
#!/bin/bash
echo “aa”
echo $B
[root@jinghang ~]# chmod +x a.sh
[root@jinghang ~]# ./a.sh
aa
发现并没有打印输出变量B的值。
[root@jinghang ~]# export B
[root@jinghang ~]# ./a.sh
aa
2
3、特殊变量
基本语法:
$n : n为数字,$0代表该脚本名称,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 9{10}
实例:
输出该脚本文件名称、输入参数1和输入参数2 的值
[root@jinghang ~]# vim b.sh
[root@jinghang ~]# bash b.sh 123
b.sh 123
1
∗ 、 *、 @
基本语法:
∗ 这 个 变 量 代 表 命 令 行 中 所 有 的 参 数 , * 这个变量代表命令行中所有的参数, 把所有的参数看成一个整体
@ 这 个 变 量 也 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @ 这个变量也代表命令行中所有的参数,不过 @@把每个参数区分对待
实例:
打印输入的所有参数
[root@jinghang ~]# vim b.sh
#!/bin/bash
echo “$0 $1 $2 ${11}”
echo $#
echo $

echo $@

[root@jinghang ~]# bash b.sh 1 2 3
b.sh 1 2
3
1 2 3
1 2 3
$?
$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
实例:
判断helloworld.sh脚本是否正确执行 0:表示成功 1:表示失败
[root@jinghang ~]# ./a.sh
aa
2
[root@jinghang ~]# echo $?
0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值