Shell最全笔记 就决定用你了

一.简介

 

 

 二.shell脚本

2.1什么是

 2.2shebang

 2.3第一个脚本

简单输出一句话

shell脚本

#!/bin/bash
echo "我是你爹"

执行:./demo1.sh

python脚本

#!/usr/bin/python
#coding:utf-8
print("我是你爹")

执行:.python pydemo.py

2.4脚本注释

 

2.5执行shell脚本的方式

2.6shell与运维

2.7弱类型

 2.8其它脚本语言

2.9shell的优势

 

2.10命令历史

2.11shell变量

 

 2.12父子shell

sh命令执行 shell脚本后创建一个bash的进程 所以,可以看到再次输出name的时候是输出的

子shell中的变量

[root@VM-4-3-centos shelldemo]# vim mk_var.sh
[root@VM-4-3-centos shelldemo]# cat mk_var.sh
name="大西瓜"
[root@VM-4-3-centos shelldemo]# ll
total 12
-rwxr-xr-x 1 root root 32 Apr  8 17:40 demo1.sh
-rw-r--r-- 1 root root 17 Apr  8 19:14 mk_var.sh
-rwxr-xr-x 1 root root 54 Apr  8 17:51 pydemo.py
[root@VM-4-3-centos shelldemo]# bash mk_var.sh
[root@VM-4-3-centos shelldemo]# name="大菠萝"
[root@VM-4-3-centos shelldemo]# echo $name
大菠萝
[root@VM-4-3-centos shelldemo]# 
[root@VM-4-3-centos shelldemo]# vim mk_var1.sh
[root@VM-4-3-centos shelldemo]# echo $userr

[root@VM-4-3-centos shelldemo]# sh mk_var1.sh
[root@VM-4-3-centos shelldemo]# echo $userr

[root@VM-4-3-centos shelldemo]# source mk_var1.sh
[root@VM-4-3-centos shelldemo]# echo $userr
root
[root@VM-4-3-centos shelldemo]# cat mk_var1.sh
userr=`whoami`

 

 2.13单双引号的区别

建议都用双引号 双引号能识别特殊字符,单引号只会原样输出单引号中的内容

[root@VM-4-3-centos bin]# name=libai
[root@VM-4-3-centos bin]# echo '${name}'
${name}
[root@VM-4-3-centos bin]# echo "${name}"
libai 

2.14shell面试题

2.15 bash_profile

这玩意用户登录时就会执行,并且执行后的变量只在当前用户下可见

[root@VM-4-3-centos ~]# echo $name
我是你爹111
[root@VM-4-3-centos ~]# cat ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

name="我是你爹111"

export PATH
[root@VM-4-3-centos ~]# useradd robert
[root@VM-4-3-centos ~]# sudo - robert
sudo: -: command not found
[root@VM-4-3-centos ~]# su - robert
[robert@VM-4-3-centos ~]$ echo $name

2.16环境变量与系统中的配置文件

2.17用户变量与全局变量

需要给用户设置该用户范围内可见变量 修改 bash_profile

需要设置全局变量 也就是所有用户可见 修改 etc下的profile

2.18设置只读变量

2.19 使用awk命令查看所有全局变量名

可以看到很多我们熟悉的,比如之前设置的JAVA_HOME

还有 HISTSIZE HOSTNAME等本身自带的

[root@VM-4-3-centos ~]# env |awk -F '=' '{print $1}'
HOSTNAME
SSL_CERT_FILE
TERM
SHELL
HISTSIZE
USER
LS_COLORS
USERNAME
PATH
MAIL
PWD
JAVA_HOME
TST_HACK_BASH_SESSION_ID
LANG
SSL_CERT_DIR
SHLVL
HOME
LOGNAME
CLASSPATH
LESSOPEN
PROMPT_COMMAND
HISTTIMEFORMAT

2.20bash多命令执行

bash支持一次性执行多条命令 跟mysql一样 以分号分开即可

2.21环境变量初始化及加载顺序 

2.22 $0 $n $# $* $@ 等特殊变量的使用与区别

 

 

 

2.23特殊状态变量

 man bash 然后

/Special Para        

2.24小练习 判断当前执行脚本参数是否为两个 若不是则给出提示

记得 []中内容两侧要空格不然会报错 ./special_statusvar.sh: line 2: [0: command not found

[root@VM-4-3-centos shelldemo]# cat special_statusvar.sh
#!/bin/bash
[$# -ne 2]&&{
echo "must be two params"
exit 119
}
echo "执行成功"
[root@VM-4-3-centos shelldemo]# vim special_statusvar.sh 
[root@VM-4-3-centos shelldemo]# ./special_statusvar.sh
must be two params
[root@VM-4-3-centos shelldemo]# ./special_statusvar.sh aa bb
执行成功
[root@VM-4-3-centos shelldemo]# 

2.25shell字串常用命令

 2.25.1 echo 与 printf 

  2.25.2 eval

  2.25.3 exec

2.26 shell中字符串的常见方法

就像java中有各种字符串的方法比如 截取 替换等等 

2.27统计不同方式计算字符串长度的消耗时间

结论:shell内置命令${#var} 最快

2.28字符串截取常见方式

2.29字符串局部批量替换小案例

如下,批量把文件名中的 juege替换为juejue

[root@VM-4-3-centos shelldemo]# touch juege_{1..5}.jpg
[root@VM-4-3-centos shelldemo]# ls
demo1.sh  juege_1.jpg  juege_2.jpg  juege_3.jpg  juege_4.jpg  juege_5.jpg  mk_var1.sh  pydemo.py  special_statusvar.sh
[root@VM-4-3-centos shelldemo]# ls *.jpg
juege_1.jpg  juege_2.jpg  juege_3.jpg  juege_4.jpg  juege_5.jpg
[root@VM-4-3-centos shelldemo]# for file_name in `ls *.jpg`;do mv $file_name `echo ${file_name/ju*ge/juejue}`;
> done
[root@VM-4-3-centos shelldemo]# ll
total 16
-rwxr-xr-x 1 root root 32 Apr  8 17:40 demo1.sh
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_1.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_2.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_3.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_4.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_5.jpg
-rw-r--r-- 1 root root 15 Apr  8 19:26 mk_var1.sh
-rwxr-xr-x 1 root root 54 Apr  8 17:51 pydemo.py
-rwxr-xr-x 1 root root 87 Apr  9 12:23 special_statusvar.sh

 2.30shell中的扩展变量,用于变量判空处理

 2.31判空处理小练习

find dir_path -name pattern :查找文件夹中符合pattern的文件

这里用:=判断查找的文件夹名是否有效 比如如果不存在就替换为dir_path

[root@VM-4-3-centos shelldemo]# ll
total 16
-rwxr-xr-x 1 root root 32 Apr  8 17:40 demo1.sh
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_1.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_2.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_3.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_4.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_5.jpg
-rw-r--r-- 1 root root 15 Apr  8 19:26 mk_var1.sh
-rwxr-xr-x 1 root root 54 Apr  8 17:51 pydemo.py
-rwxr-xr-x 1 root root 87 Apr  9 12:23 special_statusvar.sh
[root@VM-4-3-centos shelldemo]# dir_path=/shelldemo
[root@VM-4-3-centos shelldemo]# find ${dir_pp:=$dirpath} -name "juege*"
[root@VM-4-3-centos shelldemo]# find ${dir_pp:=$dirpath} -name "juejue*"
./juejue_2.jpg
./juejue_5.jpg
./juejue_3.jpg
./juejue_1.jpg
./juejue_4.jpg

2.32父子shell进一步理解

2.32.1 为啥要学习父子shell

 2.32.2sh与bash的区别

2.32.3shell脚本执行方式回顾

2.32.4使用$BASH_SUBSHELL 看是否在子shell以及子shell的层级 

 2.32.5使用()开启子shell,多少个()开多少层子shell

 

2.32.6使用pstree及ps -ef --forest查看进程列表

ps -ef --forest看到的就是以下效果 

2.33内置命令与外置命令区别 

简单来说内置命令启动时加载到内存,运行速度更快,使用 type 即可查看是否是内置命令

使用compgen -b查看所有内置命令

[root@VM-4-3-centos shelldemo]# type cd
cd is a shell builtin
[root@VM-4-3-centos shelldemo]# type exit
exit is a shell builtin
[root@VM-4-3-centos shelldemo]# compgen -b
.
:
[
alias
bg
bind
break
builtin
caller
cd
command
compgen
complete
compopt
continue
declare
dirs
disown
echo
enable
eval
exec
exit
export
false

2.34source和. bash和sh执行shell脚本的不同

2.35${vars} $() `` () $vars符号的使用区别

$() 与 `` 都是在当前shell执行命令 

()是开启子shell执行命令

${vars} 与 $vars是取值

2.36shell中的常见运算符号与运算命令

 

2.37综合小练习:编写一个进行数学运算的脚本 参数非法时进行提示

[root@VM-4-3-centos shelldemo]# . caculation.sh 12 + a
12
this is a script for math caculation pls enter number1 operator number2 as three parameters

脚本内容如下

1.该脚本编写注意事项  必须双括号才是进行数值运算

2.if 后的[] 中内容前后必须要有空格

3.$?的值为上一条命令执行的结果 如果不为1表示执行失败 

[root@VM-4-3-centos shelldemo]# cat caculation.sh
#!/bin/bash
echo "$(($1$2$3))"
if [ $? != 1 ];
then 
echo "this is a script for math caculation pls enter number1 operator number2 as three parameters"
fi

2.38小练习二 检测nginx服务是否存活

2.39expr命令

 2.40 案例一 编写脚本使用expr命令判断文件名后缀是否符合要求

[root@VM-4-3-centos shelldemo]# . expr_demo.sh aa.jpg
符合要求
[root@VM-4-3-centos shelldemo]# . expr_demo.sh aa.png
请输入以jpg结尾的文件名
[root@VM-4-3-centos shelldemo]# cat expr_demo.sh
#!/bin/bash

if expr "$1" ":" ".*\.jpg" &> /dev/null
        then echo "符合要求"
else echo "请输入以jpg结尾的文件名"
fi
[root@VM-4-3-centos shelldemo]# 

2.41编写个脚本判断参数中所有长度不大于5的单词

用./ 执行需要先加权限  chmod +x for_expr_demo.sh

[root@VM-4-3-centos shelldemo]# ./for_expr_demo.sh hello you are welcome to china , I am your father
长度不大于5的参数是
you
are
to
,
I
am
your
[root@VM-4-3-centos shelldemo]# cat for_expr_demo.sh
#!/bin/bash

echo "长度不大于5的参数是";
for word in $*
 do 
    if [ `expr length $word` -lt 5 ]
        then
            echo $word;
    fi    
done
[root@VM-4-3-centos shelldemo]#

2.42使用多种方式计算1到200中所有数字之和

2.42.1使用bc命令

tr命令:text replace,  下面报错原因是 tr前面也需要管道符

[root@VM-4-3-centos ~]# echo {1..200}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
[root@VM-4-3-centos ~]# echo {1..200} tr " " "+" |bc 
(standard_in) 1: syntax error
[root@VM-4-3-centos ~]# echo {1..200}|tr " " "+" |bc 
20100

2.42.2使用双括号计算

seq 10 生成1到10十个数字 seq -s +10 生成十个数字的同时使用+号连接

我们再使用之前说过的双括号运算即可 记得双括号内命令左右要加`` 外面要加$

[root@VM-4-3-centos ~]# seq 10
1
2
3
4
5
6
7
8
9
10
[root@VM-4-3-centos ~]# seq -s + 10
1+2+3+4+5+6+7+8+9+10
[root@VM-4-3-centos ~]# echo $((`seq -s + 200`)) 
20100

2.42.3使用expr

记得接收参数的命令是xargs 我第一次写成了 args

[root@VM-4-3-centos shelldemo]# seq -s " + " 10 | xargs expr
55


2.43 read 命令 

2.44 test 及单双中括号进行条件判断

  强调:对变量进行条件判断必须加双引号

 

 使用 test 或者 [ ] 或者[[]] 进行条件判断

[root@VM-4-3-centos shelldemo]# touch aaa.sh
[root@VM-4-3-centos shelldemo]# echo `test -e aaa.sh`

[root@VM-4-3-centos shelldemo]# test -e aaa.sh && echo "aaa.sh 已存在" || touch aaa.sh
aaa.sh 已存在
[root@VM-4-3-centos shelldemo]# [ -e "aaa" ] && echo "aaa 文件已存在" || touch aaa
aaa 文件已存在
[root@VM-4-3-centos shelldemo]# a=20
[root@VM-4-3-centos shelldemo]# [[ $a > 5 ]] && echo "a的值大于5" || echo "a的值小于等于5"
a的值小于等于5
[root@VM-4-3-centos shelldemo]# [[ $a > 5 ]] && echo "a的值小于等于5" || echo "a的值大于5"
a的值大于5
[root@VM-4-3-centos shelldemo]# 

 单中括号 [ ] 与 双中括号的异同

单中括号 [ ]
a. [ ] 两个符号左右都要有空格分隔
b. 内部操作符与操作变量之间要有空格:如 [“a” = “b” ]
c. 字符串比较中,> < 需要写成 \> \< 进行转义
d. [ ] 中字符串或者${}变量尽量使用"" 双引号扩住,以避免值未定义引用而出错
e. [ ] 中可以使用 –a –o 进行逻辑运算
f. [ ] 是bash 内置命令:[ is a shell builtin

双中括号
a. [[ ]] 两个符号左右都要有空格分隔
b. 内部操作符与操作变量之间要有空格:如 [[ “a’ = “b” ]]
c. 字符串比较中,可以直接使用 > < 无需转义
d. [[ ]] 中字符串或者${}变量尽量使用”" 双引号扩住,如未使用""会进行模式和元字符匹配
e. [[ ]] 内部可以使用 && || 进行逻辑运算
f. [[ ]] 是bash keyword:[[ is a shell keyword

2.45成为高级shell开发得多看大神写的好脚本

比如查看 

/etc/init.d/functions

/etc/init.d/mysql

脚本

2.46数值比较符号 :大于 小于 等于 不等于等在[],test,(()),[[]]中的不同表达

2.47逻辑运算符号  && || -a -o 分别在什么时候能用

&& ||跟java中一样

2.48 [] test [[]] (())的区别,常用[]

2.49综合脚本编写

让用户选择输入数字,数字对应会执行命令 这里比较简单就不写了

2.50if then,if then ifel then 等条件判断分支语句 

注意事项 一个if 对应 一个 fi  然后 [] 或者[[]]中内容首尾都要加空格

 

 

 

 

2.50使用awk获取当前内存剩余多少兆

NR:number of row 行数 起始行为1 NF:number of field 总列数

所以如下两条命令的效果一样,因为总列数为7 值不同是因为两次命令删除的间歇刚好消耗了1m

[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $NF}'
2746

[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $7}'
2745

[root@VM-4-3-centos ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3694         659         132           0        2902        2746
Swap:             0           0           0
[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $NF}'
2746

[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $7}'
2745

 

 

2.51if else练习:编写一个脚本传入两个参数 比较大小后输出告诉运行者

2.52使用 php或者python连接mysql 然后判断连接是否成功

 

 

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当学习Shell命令时,以下是一些重要的注意事项和学习建议: 1. 基本语法:Shell命令通常由命令名称和参数组成。命令名称是要执行的操作,而参数则提供了命令所需的信息。了解Shell命令的基本语法是学习的第一步。 2. 命令帮助:大多数Shell都提供了内置的命令帮助功能。通过使用命令后跟`--help`或`-h`选项,或者使用`man`命令(例如`man ls`)来获取有关特定命令的详细信息。 3. 常用命令:有一些常见的Shell命令对于日常使用非常有用。这些包括`cd`(更改目录)、`ls`(列出目录内容)、`mkdir`(创建目录)、`rm`(删除文件或目录)等。逐步学习和掌握这些命令是很重要的。 4. 管道和重定向:Shell命令非常强大,可以通过管道和重定向符号将多个命令组合在一起。了解如何使用管道(`|`)将一个命令的输出作为另一个命令的输入,并使用重定向符号(`>`、`>>`、`<`)来控制输入和输出。 5. 脚本编写:Shell脚本是一种将多个命令组合在一起以自动化任务的方法。学习如何编写简单的Shell脚本可以提高工作效率。 6. 实践和练习:最重要的是进行实践和练习。尝试使用不同的Shell命令来完成各种任务,并在实际场景中应用所学知识。 记住,Shell命令的学习是一个逐步的过程。开始时可能会有些困惑,但随着实践和经验的积累,你会变得越来越熟练。希望这些提示对你有帮助!如有任何具体问题,随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我才是真的封不觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值