Linux | 替换 / 元字符 / 转义
2022/1/24 7:06:06
本文主要是介绍Linux | 替换 / 元字符 / 转义,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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 例题:终止指定名字的所有进程
1 变量
1.1 变量的赋值及使用
bash变量
- 字符串(对于数字串来说,不是二进制形式)。
- 在执行过程中其内容可以被修改。
bash变量名
- 第一个字符必须为字母
- 其余字母可以是字母、数字、下划线。
赋值与引用
- addr=202.114.34.54 #赋值作为单独的一条命令,等号两侧不允许有多余的空格。
- 应用addr变量的方法:$addr或者${addr},例如:ftp $addr
命令行中含有$符的变量引用,shell会先完成变量替换。
1)赋值时,等号右侧字符串中含有特殊字符(例如有空格时,需要用引号,负责系统会认为是第一个单词)。
- unit="Changan University"
- echo $unit
2)应用未定义变量,变量值为空字符串。(这是一种错误的用法,应避免)
shell内部开关
set -u 当引用一个未定义的变量时,产生一个错误。
set +u 当引用一个未定义的变量时,认为是一个空串(默认情形)
1.2 命令echo
echo arg1 arg2 arg3 ...
打印各命令行参数,每两个间用一空格分开,最后打印换行符。
不可打印字符(转义):LInux需加选项-e,(不同UNIX间兼容性差)
- echo支持C语言转义字符串常数描述格式的转义和\c
- \b 退格 \n 换行 \r 回车 \t 水平制表
- \\ 反斜线 \nnn 八进制描述的字符ASCII码
- \c 打印完毕,不换行
缺点:不同的UNIX之间兼容性较差
$ echo Beijing CHINA >> Beijing CHINA #echo打印第一个单词之后打印一个空格,然后打印第二个单词。 $ echo Beijing CHINA >> Beijing CHINA $ echo "Beijing CHINA" >> Beijing CHINA
1.3 在脚本中编辑文件
read:读用户的输入
内部命令read:变量取值的另外一种方法
从标准输入读入一行内容赋值给变量
- 例如:读取用户的输入,并使用输入的信息。read name
1.4 环境变量
(1)环境变量和局部变量
所创建的shell变量,默认为局部变量。
内部命令 export
局部变量转换为环境变量,例如:export proto
- shell启动的子进程继承环境变量,不继承局部变量。
- 子进程对环境变量的修改,不影响父进程中同名变量。同样,父进程的修改也不会影响子进程,子父进程的环境变量各自发展,互不影响。(环境变量的设置,如PATH,CLASSPATH, LANG,吐过必要的话放在~/.bashrc中或/etc/profile中)
(2)系统的环境变量
登录后系统自动创建的一些环境变量影响应用程序运行。
HOME:用户主目录的路径名
PATH:命令查找路径
- PATH=/bin:/usr/bin:/ect #在三个目录里面查找。
- 与DOS/Windows不同的是,它不首先搜索当前目录。
- PATH=.:/bin:/usr/bin:/etc 先搜索当前目录(危险操作!!!)
- PATH=/bin:/usr/bin:/etc:. 后搜索当前目录(危险操作!!!)
TERM:终端类型
(3)相关命令set/env
- 内部命令set列出当前所有变量及其值以及函数定义(包括环境变量和局部变量、函数定义) set | grep ^fname=
- 外部命令/bin/env列出环境变量及其值
- 使用env可以列出所有的环境变量。set会列出所有的局部变量以及一些函数定义都会列出来(罗列出来好多东西,一般会加筛选 set | grep ^abs)。
2 替换
(1)shell替换
shell的替换工作:先替换命令行再执行命令
文件名生成
遵循文件通配符规则,按照字典序排列。如:ls *.c文件名替换后实际执行ls a.c x.c
变量替换
- ls $HOME
- echo "My home is $HOME, Terminal is $TERM"
命令替换(反撇号`` | $())
- now=`date` 以命令date的stdout替换`date`
- ./arg `date` 实际执行 ./arg Sun Nov 2 12:23:34 Beijing 2021
- ts=`date '+%Y%m%d-%H%M%S'` 定义变量显示年月日;mv myap.log `whoami` -$te.log 修改myap.log文件名为 当前登录用户的用户名+当前日期作为文件名。(whoami显示当前用户名)
- count=10 count=`expr $count + 1` 实现运算
- 反撇号 `` 也可以使用 $() 来代替使用,作用是一样。
(2)shell内部变量:位置参数
- $0 脚本文件本身的名字
- $1 $2 1号命令行参数,2号命令行参数...
- $# 命令行参数的个数
- "$*" 等同于"$1 $2 $3 $3 ..."
- "$@" 等同于"$1" "$2" "$3" ... 用于把变长的命令行参数传递给其他命令。
- 内部命令shift 位置参数的移位操作,$#的值减1,旧的$2变为$1,旧的$3变为$2,以此类推。其他用法如:shift 3(移位三个位置)。
...$ 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
3 元字符和转义
3.1 元字符
(1)元字符
元字符,换言之就是特殊字符。
- 空格,制表符 命令号参数的分隔符
- 回车 执行键入的命令
- > < | 重定向与管道(还有||)
- ; 用于一行内输入多个命令(还有;;),和回车命令类似表示一条命令结束。
- & 后台运行(还有&&)
- $ 引用shell标量
- `` 反向单引号,用于命令替换
- * [] ? 文件通配符(echo "*" 与 echo * 不同)
- ~ 代表当前用户主目录
- () 用于定于shell函数或在子shell中执行一组命令
- () > < | ; & 等除了它们自身的特殊含义之外还同时起到分割符的作用(同空格)
转义符
- 反斜线作转义符,取消其后元字符的特殊作用。
- 反斜线加在非元字符前面,反斜线跟没有一样。
(2)元字符:单引号与双引号
使用中需要注意单引号和双引号,以及转义字符混合使用的情况。遇到这种情况应该从左往右逐个分析处理,得到最终结果。
双引号 " "
- 除$和 `外特殊字符的特殊含义被取消(保留一定的灵活性)。
- 双引号里面若有'',则需要转义,例如:\'' \$ \' \\
单引号 ' '
- 对所括起来的任何字符,不作特殊解释(包括单引号和双引号)。
- 系统扫描单引号开始,停止对所有字符的特殊解释,直到再次遇到单引号为止(换言之,单引号里面的东西不做任何处理和解释)。
- echo "This is my $HOME" #和面的HOME要进行替换
- echo 'This is my $HOME' #后面的HOME不进行替换
3.2 引号及转义处理
(1)转义问题
在人机交互的过程中,当遇到特殊字符的时候,需要区分到底是特殊字符还是字面含义,需要告诉计算机(比如:$表示的是字符本身还是告诉计算机后面需要进行替换),所以就出现了转义的概念。听到过一个对于转义比较形象的比喻:有一个人 张某某,那么这个人的名字就叫某某,还是叫其他名字?
1)正则表达式转义描述
- 例如,3\.14 这样就表示3.14;如果没有\,系统就将3加14找出来。
2)shell的元字符转义
- echo -e "\\033[Hvalue=\"$value\"\n"
- vi Date\ File.txt # 表示该文件名含有空格,\用于取消特殊字符空格的特殊含义。
3)匹配的单引号中
匹配的单引号里面 \ 代表反斜线自身,不许任何转义,不许中间插入单引号,或者认为把两个单引号之间的单引号修改为四个字符 '\' '(如果非要加 ',需要先加一个 ' 用于取消前面的 ',然后用 \' 来表示真正的单引号,再在后面加 ' 和后面单引号匹配)。
4)配对的双引号中
在配对的双引号里面遇见 $ ` \ " 需要注意,如果需要显示这些符号本身,需要按下述进行转义。除了这4个之外再没有其他的特殊要求。
- \" 代替双引号自身
- \\ 代表反斜线自身
- \` 代表反撇号自身
- \$ 代表$自身
5)配对的反撇号中
- \\ 代表反斜线自身
- \` 代表反撇号自身
- 目的是为了反撇号的嵌套,例如:10年期前是哪一年? year=`expr \` date '+%Y'\` - 10`
(2)应用程序的转义处理与shell的转义处理
在 *.conf 文件中找行尾是被单引号括起来的IP地址 192.168.x.x 的行。(需要找被单引号括起来的一个IP地址,但是目前只记得前两个地址,同时记得IP地址的两侧均有单引号,且处于一行的最后位置)。
grep 得到的第一个参数字符串应该为正则表达式 '192\.168\.[0-9]*'$ 其中的$代表行尾。三种不同的实现方式
- 使用单引号: grep \''192\.168\.[0-9.]*'\''$' *.conf
- 使用双引号: grep "'192\\.168\\.[0-9.]*'\$" *.conf
- 什么都不用: grep \'192\\.168\\.\[0-9.]\*\'\$ *.conf
3.3 例题:终止指定名字的所有进程
反撇号内的转义处理
例:给出程序名字,中止系统正在运行的进程,通常的做法如下所示:
$ 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所找出的进程
这篇关于Linux | 替换 / 元字符 / 转义的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法