Linux教程

Linux | 替换 / 元字符 / 转义

本文主要是介绍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 | 替换 / 元字符 / 转义的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!