shell的基本操作

大家好我是世态炎凉,我叫小杨!

什么时shell?


shell就是在操作系统和应用程序之间的一个命令翻译工具。
shell的定义:
在计算机科学中,shell就是一个命令解释器。
shell是位于操作系统和应用程序之间,是他们二者最重要的接口,shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。
shell的分类:
图形界面shell:图形界面shell就是我们常说的桌面
命令形式shell:windows系统:cmd.exe 命令提示字符
linux系统: sh/csh/ksh/bash/。。。
我们常说的shell是命令形式的shell,在工作中常用的是Linux系统下bash。

查看系统shell信息
查看系统shell信息:echo ¥¥SHELL
查看当前系统环境支持的shell:[root@linux-node1~]# cat /etc/shells
/usr/bin/sh 或者 /usr/bin/sh
/usr/bin/bash 或者 /usr/sbin/nologin
shell脚本
shell使用方式:
手工方式:手工敲击键盘,在shell的命令行输入命令,按Enter后,执行通过键盘输入的命令,然后shell返回并显示命令执行的结果。
重点:逐行输入命令、逐行进行确认执行。
脚本方式:就是说我们把手工执行的命令a,写到一个脚本文件b中,然后通过执行脚本把,达到执行命令a的效果。
shell脚本定义:当可执行的Linux命令或语句不再命令行状态下执行,而是通过一个文件执行时,我们称文件为shell脚本。
shell脚本示例:#!/bin/bash
# 这是临时shell脚本
echo ‘nihao’
echo ‘i他cast’
脚本执行效果
[root@linux-nodel ~] # /bin/bash itcast。sh
nihao
itcast
脚本创建工具:
创建脚本的常见编辑器是 vi/vim
脚本命令:shell脚本的命名简单来说就是要有意义,方便我们通过脚本名,来知道这个文件是干什么用的。
脚本内容:各种可以执行的命令。
注释内容:
单行注释:
除了首行的#不是注释外,其他所有行内容只要首字符是#,那么就表示该行是注释
#!/bin/bash
echo “1”

echo “2” # 这一行就是表示注释

echo “3”
多行注释:
多行注释有两种方法: :<<! 。。。! 和 :<<字符。。。字符
#!/bin/bash
echo “1”
:<<! echo “2”
echo “3”
!
echo “4” 执行结果是1 4
脚本执行:
shell执行的方式:
shell脚本的执行通常可以采用以下几种方式
bash/path/to/script-name 或 /bin/bash/path/to/script-name (强烈推荐使用)
/path/to/script-name 或./script-name (当前路径下执行脚本)
source script-name 或./script-name (注意“。”点号)
例如:vim python.sh
#!/usr/bin/python
print(“hello world”)
添加权限:chmod +x python
执行脚本: ./python
执行说明:1、脚本文件本身没有可执行权限或者脚本首行没有命令解释器时使用的方法,我们推荐使用bash执行。
2、脚本文件具有可执行权限时使用。
3、使用source或者.点好,加载shell脚本文件内容,使shell脚本内容环境和当前用户环境一致。

脚本开发规范
1、脚本命名要有意义,文件后缀时.sh
2、脚本文件首行是而且必须是脚本解释器
#!/bin/bash
3、脚本文件解释器后面要有脚本的基本信息等内容,脚本文件中尽量不要使用中文注释,
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等
4、脚本文件常见执行方式:bash脚本名
5、脚本内容执行:从上到下依次执行
6、代码书写优秀习惯
1)成对内容的一次性写出来,防止遗漏。如:(){} [] ’ ’ `` “”
2) []中括号两端要有空格,书写时即可留出口哥哥[ ],然后再退格书写内容。
3) 流程控制语句一次性书写完,再添加内容。
7、通过缩进让代码易读,(即该有空格的地方就要有空格)
变量
变量包括两部分 1:变量名 不变的 2:变量值 变化的
我们一般说的变量指的是变量名
本地变量:
普通变量的定义方式有三种:
方式一:
变量名=变量值 即:变量值必须是一个整体,中间没有任何特殊字符
方式二:
变量名=‘变量值’ 即: 看到什么内容,就输出什么内容
方式三:
变量名=“变量值”
即:如果变量值范围内有可以解析的变量A,那么首先解析变量A,将A的结果和其 他内容组合成一个整体,重新赋值给变量B.

注意:数字不加引号,其他默认加双引号

命令变量(熟练)
命令变量有两种定义方式,接下来我们就来介绍一下这两种方式

定义方式一:
变量名=命令
注意:
` 是反引号

定义方式二:
变量名=$(命令)

执行流程:
1、执行``或者$()范围内的命令
2、将命令执行后的结果,赋值给新的变量名A

2.2.3 全局变量
全局变量是什么
全局变量就是:在当前系统的所有环境下都能生效的变量。

查看全局变量命令
可以通过命令查看环境变量
env 只显示全局变量

定义全局变量
方法一:
变量=值
export 变量
方法二:(最常用)
export 变量=值

扫描二维码关注公众号,回复: 5752073 查看本文章

2.2.4 变量查看和取消
查看变量:
方式一:
/ 使 &quot; 变量名 场景: 私下里,在命令行/脚本中使用 图省事 方式二: &quot; 变量名"
场景:
私下里,在命令行/脚本中使用
图省事
方式三:
${变量名}
场景:
echo " dsa dsafsa dsafsa f &quot; 使 &quot; {变量名} f &quot; 使用频率较高 方式四: &quot; {变量名}"
场景:
标准使用方式

取消变量
unset 变量名

2.2.5 shell内置变量
我们之前学习的本地变量,全局变量都是需要通过定义,然后才能实现相应功能的,那么有没有一些变量我们可以直接拿过来使用实现某种具体的功能呢?有,这就是shell内置变量
和脚本文件有关
符号 意义
$0 获取当前执行的shell脚本文件名,包括脚本路径
n s h e l l n n = 1..9 n 0 n 9 n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大 括号括起来 {10}
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功,非0为失败)

重点内置变量演示效果:
$0 获取脚本的名称
示例:
#!/bin/bash

获取脚本的名称

echo “我脚本的名称是: file.sh
echo “我脚本的名称是:$0”

$# 获取当前脚本传入参数的数量
$n 获取当前脚本传入的第n个位置的参数
示例:
#!/bin/bash

获取当前脚本传入的参数数量

echo “当前脚本传入的参数数量是: $#”

获取指定位置的参数

echo “第一个位置的参数是: $1”
echo “第二个位置的参数是: $2”
echo “第三个位置的参数是: $3”
echo “第四个位置的参数是: $4”

$? 获取文件执行或者命令执行的返回状态值
示例:

bash nihao

bash: nihao: No such file or directory

echo $?

127

ls

file1.sh num.sh test.sh weizhi.sh

echo $?

0

字符串精确截取
格式:${变量名:起始位置:截取长度}

示例:
${file:0:5} 从第1个字符开始,截取5个字符
${file::5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:5} 从第6个字符开始,截取后面所有的字符
${file:0-5} 从倒数第5个字符开始,截取后面所有的字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符

默认值相关
场景一:
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容

格式:
   ${变量名:-默认值}

套餐示例:
   如果我输入的参数为空,那么输出内容是 "您选择的套餐是: 套餐 1"
   如果我输入的参数为n,那么输出内容是 "您选择的套餐是: 套餐 n" 

#!/bin/bash

套餐选择演示

a="$1"
echo “您选择的套餐是: 套餐 ${a:-1}”

场景二:
无论变量a是否有内容,都输出默认值
格式:
${变量名+默认值}
场景示例:
不管我说国家法定结婚年龄是 多少岁,都输出 国家法定结婚年龄(男性)是 22 岁
#!/bin/bash

默认值演示示例二

a="$1"
echo “国家法定结婚年龄(男性)是 ${a+22} 岁”

第 3 章 SHELL 进阶
这部分的知识,我们主要是从三个方面来学习:
测试语句
表达式(条件+计算)
linux常见符号和命令
3.1 表达式
要使Shell脚本程序具备一定的“逻辑能力”,面临的第一个问题就是:区分不同的情况以确定执行何种操作,下面我们就来学习解决这个问题—测试语句
3.1.1 测试语句
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0,表示成功,值为其他时,表示失败。使用专门的测试工具—test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值0为成立)

测试语句形式
A: test 条件表达式
B: [ 条件表达式 ]
格式注意:
以上两种方法的作用完全一样,后者为常用。
但后者需要注意方括号[、]与条件表达式之间至少有一个空格。
test跟 [] 的意思一样
条件成立,状态返回值是0
条件不成立,状态返回值是1

操作注意:
[]两侧为什么要有空格
root@ubuntu:~# [1 = 1 ]
[1: command not found
可以看到:
两侧没有空格,就会报错,为什么呢?因为你不合规范

3.1.2 条件表达式
我们这部分内容主要是介绍,测试语句中的 [ 条件表达式 ] 这一部分,测试的结果使用 echo $? 来查看

逻辑表达式
逻辑表达式一般用于判断多个条件之间的依赖关系。
常见的逻辑表达式有: && 和 ||

&&
命令1 && 命令2
如果命令1执行成功,那么我才执行命令2 – 夫唱妇随
如果命令1执行失败,那么命令2也不执行
示例:

[ 1 = 1 ] && echo “条件成立”

条件成立

[ 1 = 2 ] && echo “条件成立”

||
命令1 || 命令2
如果命令1执行成功,那么命令2不执行 – 对着干
如果命令1执行失败,那么命令2执行
示例:

[ 1 = 2 ] || echo “条件不成立”

条件不成立

[ 1 = 1 ] || echo “条件不成立”

文件表达式

-f 判断输入内容是否是一个文件
示例:

[ -f weizhi.sh ] && echo “是一个文件”

是一个文件

[ -f weizhi.sddh ] || echo “不是一个文件”

不是一个文件

-d 判断输入内容是否是一个目录
示例:

[ -d weizhi.sddh ] || echo “不是一个目录”

不是一个目录

mkdir nihao

[ -d nihao ] && echo “是一个目录”

是一个目录

-x 判断输入内容是否可执行
示例:

[ -x age.sh ] || echo “文件没有执行权限”

文件没有执行权限

[ -x test.sh ] && echo “文件有执行权限”

文件有执行权限

数值操作符

主要根据给定的两个值,判断第一个与第二个数的关系,如是否大于、小于、等于第二个数。常见选项如下:
n1 -eq n2 相等
n1 -gt n2 大于
n1 -ge n2 大于等于
n1 -lt n2 小于
n1 -le n2 小于等于
n1 -ne n2 不等于

字符串比较

str1 == str2 str1和str2字符串内容一致
str1 != str2 str1和str2字符串内容不一致,!表示相反的意思
实践
判断字符是否内容一致
root@ubuntu:~# [ a == a ]
root@ubuntu:~# echo $?
0
root@ubuntu:~# [ a != a ]
root@ubuntu:~# echo $?
1

3.1.3 计算表达式
定义:
计算表达式,简单来说就是对具体的内容进行算数计算

格式:
方式一:
$(()) $(( 计算表达式 ))
方式二:
let let 计算表达式

注意:
$(())中只能用±*/和()运算符,并且只能做整数运算

( ( ) ) a = (())演示效果 格式:a= ((变量名a+1))
注意:
表达式范围内,空格不限制
计算示例
root@ubuntu:~# echo $((100/5))
20

let演示效果
格式:let 变量名a=变量名a+1
注意:
表达式必须是一个整体,中间不能出现空格等特殊字符
let示例
root@ubuntu:~# i=1
root@ubuntu:~# let i=i+7
root@ubuntu:~# echo $i
8
3.2 linux常见符号
接下来我们来介绍几个linux的场景符号:
重定向符号、管道符、其他符号
3.2.1 重定向符号
在shell脚本中有两种常见的重定向符号 > 和 >>

符号
作用:
表示将符号左侧的内容,以覆盖的方式输入到右侧文件中
演示:
查看文件内容
admin-1@ubuntu:~$ cat file.txt
nihao
使用重定向符号给文件中增加内容
admin-1@ubuntu:~$ echo “file1.txt” > file.txt
再次查看文件内容
admin-1@ubuntu:~$ cat file.txt
file1.txt

符号
作用:

表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中
演示:
查看文件内容
admin-1@ubuntu:~$ cat file.txt
file1.txt
使用重定向符号给文件中增加内容
admin-1@ubuntu:~$ echo “file2.txt” >> file.txt
再次查看文件内容
admin-1@ubuntu:~$ cat file.txt
file1.txt
file2.txt

3.2.2 管道符 |
定义:
| 这个就是管道符,传递信息使用的

使用格式:
命令1 | 命令2
管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2使用

命令演示:
查看当前系统中的全局变量SHELL
admin-1@ubuntu:~$ env | grep SHELL
SHELL=/bin/bash

3.2.3 其他符号
后台展示符号 &
定义:
& 就是将一个命令从前台转到后台执行
使用格式:
命令 &
命令演示:
admin-1@ubuntu:~# sleep 4
界面卡住4秒后消失
admin-1@ubuntu:~# sleep 10 &
[1] 4198
admin-1@ubuntu:~# ps aux | grep sleep
root 4198 0.0 0.0 9032 808 pts/17 S 21:58 0:00 sleep 10
root 4200 0.0 0.0 15964 944 pts/17 S+ 21:58 0:00 grep --color=auto sleep

Ctrl+Z 让当前任务转入到后台并停止
jobs 查看后台任务
fg 让后台进程转入到前台执行
bg 让后台停止的任务继续在后台执行

全部信息符号 2>&1
符号详解:
1 表示正确输出的信息
2 表示错误输出的信息
2>&1 代表所有输出的信息
符号示例
标准正确输出示例
cat nihao.txt 1>> zhengque
标准错误输出示例
dsfadsfadsfa 2>> errfile

综合演练示例
脚本内容
#!/bin/bash
echo ‘下一条错误命令’
dsfsafsafdsa
脚本执行效果
admin-1@ubuntu:~# bash ceshi.sh
下一条错误命令
ceshi.sh: line 3: dsfsafsafdsa: command not found
1 和 2 综合演练
admin-1@ubuntu:~# bash ceshi.sh 1>> ceshi-ok 2>> ceshi-err
admin-1@ubuntu:~# cat ceshi-ok
下一条错误命令
admin-1@ubuntu:~# cat ceshi-err
ceshi.sh: line 3: dsfsafsafdsa: command not found
全部信息演练
admin-1@ubuntu:~# bash ceshi.sh >> ceshi-all 2>&1
admin-1@ubuntu:~# cat ceshi-all
下一条错误命令
ceshi.sh: line 3: dsfsafsafdsa: command not found

linux系统垃圾桶
/dev/null 是linux下的一个设备文件,
这个文件类似于一个垃圾桶,特点是:容量无限大

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44786231/article/details/88747812