Linux专栏主要系统介绍了在Linux的开发和应用过程中所需要的各种基础知识和相关命令,共分为七部分。
1. Linux | 系统状态查看 / 文本文件处理命令_菜鸟的人工智能之路的博客-CSDN博客
2. Linux | 正则表达式和相关概念_菜鸟的人工智能之路的博客-CSDN博客
3. Linux | 文件比较 / vi编辑与使用 / 文件通配符_菜鸟的人工智能之路的博客-CSDN博客
4. Linux | 文件管理 / 目录管理_菜鸟的人工智能之路的博客-CSDN博客
5. Linux | 命令风格 / 文件系统_菜鸟的人工智能之路的博客-CSDN博客
6. Linux | 文件的目录和权限 / Shell的基本机制_菜鸟的人工智能之路的博客-CSDN博客
7. Linux | 替换 / 元字符 / 转义_菜鸟的人工智能之路的博客-CSDN博客
文章目录
1 变量
1.1 变量的赋值及使用
1.2 命令echo
1.3 在脚本中编辑文件
1.4 环境变量
(2)系统的环境变量
(3)相关命令set/env
2 替换
(1)shell替换
(2)shell内部变量:位置参数
3 元字符和转义
3.1 元字符
(1)元字符
(2)元字符:单引号与双引号
3.2 引号及转义处理
(1)转义问题
(2)应用程序的转义处理与shell的转义处理
3.3 例题:终止指定名字的所有进程
bash变量
bash变量名
赋值与引用
命令行中含有$符的变量引用,shell会先完成变量替换。
1)赋值时,等号右侧字符串中含有特殊字符(例如有空格时,需要用引号,负责系统会认为是第一个单词)。
2)应用未定义变量,变量值为空字符串。(这是一种错误的用法,应避免)
shell内部开关
set -u 当引用一个未定义的变量时,产生一个错误。
set +u 当引用一个未定义的变量时,认为是一个空串(默认情形)
echo arg1 arg2 arg3 ...
打印各命令行参数,每两个间用一空格分开,最后打印换行符。
不可打印字符(转义):LInux需加选项-e,(不同UNIX间兼容性差)
缺点:不同的UNIX之间兼容性较差
$ echo Beijing CHINA >> Beijing CHINA #echo打印第一个单词之后打印一个空格,然后打印第二个单词。 $ echo Beijing CHINA >> Beijing CHINA $ echo "Beijing CHINA" >> Beijing CHINA
read:读用户的输入
内部命令read:变量取值的另外一种方法
从标准输入读入一行内容赋值给变量
(1)环境变量和局部变量
所创建的shell变量,默认为局部变量。
内部命令 export
局部变量转换为环境变量,例如:export proto
登录后系统自动创建的一些环境变量影响应用程序运行。
HOME:用户主目录的路径名
PATH:命令查找路径
TERM:终端类型
shell的替换工作:先替换命令行再执行命令
文件名生成
遵循文件通配符规则,按照字典序排列。如:ls *.c文件名替换后实际执行ls a.c x.c
变量替换
命令替换(反撇号`` | $())
...$ ls > mysp.log ...$ ts=`date '+%Y%m%d-%H%M%S'`; cp myap.log `whoami`-$ts.log ...$ ls *.log liu-20211221-123021.log myap.log
元字符,换言之就是特殊字符。
转义符
使用中需要注意单引号和双引号,以及转义字符混合使用的情况。遇到这种情况应该从左往右逐个分析处理,得到最终结果。
双引号 " "
单引号 ' '
在人机交互的过程中,当遇到特殊字符的时候,需要区分到底是特殊字符还是字面含义,需要告诉计算机(比如:$表示的是字符本身还是告诉计算机后面需要进行替换),所以就出现了转义的概念。听到过一个对于转义比较形象的比喻:有一个人 张某某,那么这个人的名字就叫某某,还是叫其他名字?
1)正则表达式转义描述
2)shell的元字符转义
3)匹配的单引号中
匹配的单引号里面 \ 代表反斜线自身,不许任何转义,不许中间插入单引号,或者认为把两个单引号之间的单引号修改为四个字符 '\' '(如果非要加 ',需要先加一个 ' 用于取消前面的 ',然后用 \' 来表示真正的单引号,再在后面加 ' 和后面单引号匹配)。
4)配对的双引号中
在配对的双引号里面遇见 $ ` \ " 需要注意,如果需要显示这些符号本身,需要按下述进行转义。除了这4个之外再没有其他的特殊要求。
5)配对的反撇号中
在 *.conf 文件中找行尾是被单引号括起来的IP地址 192.168.x.x 的行。(需要找被单引号括起来的一个IP地址,但是目前只记得前两个地址,同时记得IP地址的两侧均有单引号,且处于一行的最后位置)。
grep 得到的第一个参数字符串应该为正则表达式 '192\.168\.[0-9]*'$ 其中的$代表行尾。三种不同的实现方式
反撇号内的转义处理
例:给出程序名字,中止系统正在运行的进程,通常的做法如下所示:
$ ps -e | grep myap # 列出含有myap的进程 12345 pts/2 0:00 myap $ kill 12345 # kill掉myap进程
现在需要将上述几步中手工处理的问题通过脚本实现
$ ps -e | grep myap # 列出进程名含有myap的进程 12345 pts/2 00:00:00 myap 12346 pts/0 00:00:00 myapp 12347 pts/0 00:00:00 xmyap # 可以看到我们希望列出只要myap的进程,但实际中将myapp和xmyapp都列出了 # 脚本文件 # 匹配只有myap的进程,同时打印第一个参数(也就是只打印进程号) ps -e | awk '/[0-9]:[0-9][0-9] myap$/ { printf("%d ", $1);}' # 通过对脚本文件赋属性 chmod a+x kj 可以执行./kj命令进行操作 # 如果需要在命令行中可以选择kill那个进程,需要修改(将命令中的''改为"",同时""不能里面不能有"和$) ps -e | awk "/[0-9]:[0-9][0-9] myap\$/ { printf(\"%d \", \$1);}" # 此时和上述功能一样 # 这样就通过命令行参数传递需要找出的进程号 ps -e | awk "/[0-9]:[0-9][0-9] \$1\$/ { printf(\"%d \", \$1);}" # 此时使用 ./kj myapp 将找出仅进程名中只含有myapp的进程 # ``里面不允许有``和反斜线 PIDS=`ps -e | awk "/[0-9]:[0-9][0-9] \\$1\\$/ { printf(\\"%d \\", \\$1);}"` echo $PIDS # 打印找出的进程 kill $PIDS # kill所找出的进程 # 还有一种方法 PIDS=`ps -e | awk '/[0-9]:[0-9][0-9] '$1'$/ { printf("%d ", $1);}'` echo $PIDS # 打印找出的进程 kill $PIDS # kill所找出的进程