目录
概述
Shell从诞生之初,就和普通的PC用户无缘了,工程师应该会喜欢Shell,maybe是这个样子的。
shell 提供了你和操作系统Linux之间的通讯方式。
shell的工作方式有两种
-
REPL
-
写成脚本(命令集合),然后在执行
你在终端写出的shell命令,计算机是无法直接理解的,需要shell解释器来完成翻译工作,shell解释器有多种,使用如下的命令来查看当前机器有哪些shell
cat /etc/shells
执行脚本的方式
-
bash + 脚本的相对或者是绝对路径:bash解释器帮助你执行脚本,并不需要执行权限
-
./script.sh 脚本自己执行(当前脚本需要可执行,也即需要执行权限)
变量
关于用户自定义变量,比较需要注意的地方:
- 变量名=变量值(等号两边不要有空格,这个我吃过大亏)
- 获取变量值:$变量名
- 撤销变量:unset 变量名
重要:但凡脚本定义变量的时候,不带$,再次使用的时候都需要添加$
变量的获取
-
$1, $2, $x 获取第一/二/x个参数
-
$# 获取参数的个数
-
$* 获取所有参数,参数是一个整体
-
$@ 获取所有参数,每个参数区分对待
下面举个例子说明下$* 和$@
[pyd@pydServer pyd-electrician-app_apollo]$ bash test.sh 1 2 3
1 2 3
1
2
3
[pyd@pydServer pyd-electrician-app_apollo]$ cat test.sh
#/bin/bash
for i in "$*"
do
echo "$i"
done
for i in "$@"
do
echo "$i"
done
强调一点,在日常写shell脚本的时候,如果获取变量要养成添加 "" 的习惯,""能够获取变量值,即便不写也是OK的,如果能够获取到变量,vim能够表现出特定的颜色,但是添加""是一个好的习惯。
变量的获取中:
-
单引号不获取变量值
-
双引号获取变量值
-
嵌套中,双引号中的单引号可以取值,反之不行
-
反引号执行反引号中的命令
具体看下面的示例
[pyd@pydServer pyd-electrician-app_apollo]$ bash test.sh 2019
$command
2019
'2019'
"$command"
2020年 01月 09日 星期四 00:26:08 CST
[pyd@pydServer pyd-electrician-app_apollo]$ cat test.sh
#/bin/bash
command=$1
echo '$command'
echo "$command"
echo "'$command'"
echo '"$command"'
echo `date`
ps:如果不添加echo,解释器会认为每一行是一句命令。其实,解释器认为每一行都是命令。
数据运算在shell中:"$((运算式))" 或者是 "$[()]" 这里尤其是"" 和 $
[pyd@pydServer pyd-electrician-app_apollo]$ a="$((1+2))"
[pyd@pydServer pyd-electrician-app_apollo]$ echo "$a"
3
常用 (vim + awk)
介绍几个有用的vim模式中非常有用的快捷键:
-
a 当前光标的下一个
-
o 当前光标的下一行
-
i 当前光标
-
shift + g 最后一行
-
shift + 4 光标所在行的最后一个字符
-
:x 定位第x行
-
:/xxx 搜索xxx
两个有用的系统函数
-
basename
-
dirname
作用如下:
[root@hadoop102 shell]# basename /root/shell/if.sh
if.sh
[root@hadoop102 shell]# dirname /root/shell/if.sh
/root/shell
shell的文本分析工具有cut、sed、最强大的就是awk,具体说说awk,awk是贝尔实验室在77年搞出来的文本编辑神器,这个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。cut能实现的,AWK都能实现。基本用法:awk [选项参数] ‘pattern1{action1} pattern2{action2}...’ filename;
-
pattern:表示AWK在数据中查找的内容,就是匹配模式
-
action:在找到匹配内容时所执行的一系列命令
-
-F :参数,指定输入文件折分隔符
-
-v :参数,赋值一个用户定义变量
AWK的处理流程:首先拿出第一行,然后匹配第一个模板,如果匹配上,就执行action1,如果匹配不上,就什么都不执行,然后匹配第二个模板,匹配上就执行action1,匹配不上就什么也不执行。下面仅举出一个例子,取出第三行的daemon字符串
[root@hadoop103 shell]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hadoop103 shell]# awk -F : '/^daemon/{print $5}' /etc/passwd
daemon
$5表示取出的是第五列,$0表示取出整行,^example的意思是匹配以example为开头的字符串。
上初中的时候猛然照镜子的时候发现,帅是不可能的,这辈子都不可能了;
大四毕业的时候发现高一买的的衣服还穿在身上,高是不可能的了,这辈子都不可能了;
富,还有可能。
[参考]:
[Shell之awk](https://coolshell.cn/articles/9070.html)