0%

Linux-9-替换、元字符和转义

Linux学习第九周笔记

内容搬运自蒋老师的ppt

变量的赋值及使用

bash变量

  • 存储的内容
    1. 字符串
    2. 在执行过程中内容可以被修改
  • 变量名
    1. 第一个字符必须为字母
    2. 其余字符可以是字母,数字,下划线

变量的赋值与引用

  • 赋值与引用

    1
    2
    addr=20.1.1.254
    ftp $addr

    注意:赋值作为单独一条命令,等号两侧不许多余空格
    引用addr变量的方法: $addr 或 ${addr}

    1
    2
    echo ${addr}A
    echo $addrA

    命令行中含有$符的变量引用,shell会先完成变量替换

  • 赋值时有空格特殊字符,需要加引号

    1
    2
    unit="Beiyou University"
    echo $unit
  • 引用未定义变量,变量值为空字符串

shell内部开关

  • set -u 当引用一个未定义的变量时,产生一个错误
  • set +u 当引用一个未定义的变量时,认为是一个空串(默认情形)
  • set -x 执行命令前打印出shell替换后的命令及参数,为区别于正常的 shell输出,前面冠以+号
  • set +x 取消上述设置

echo

  • 语法和功能
    echo arg1 arg2 arg3 … 打印各命令行参数,每两个间用一空格分开,最后打印换行符

  • 不可打印字符(转义):Linux需加选项-e,(不同UNIX间兼容性差)

    1. echo支持C语言字符串常数描述格式的转义和\c
    • \c 打印完毕,不换行
    • \b 退格
    • \n 换行
    • \r 回车
    • \t 水平制表
    • \ 反斜线
    • \nnn 八进制描述的字符ASCII码
    1. 举例
    1
    2
    3
    4
    echo Beijing    China #只打印一个空格
    echo "Beijing China" #多个空格
    echo –e '\065' #打印5
    echo -e "\\r$cnt \\c"

命令printf

命令printf,用法与C函数printf类似,例如:

1
printf '\033[01;33mConnect to %s Network\n' $proto

在脚本中编辑文件

read 读用户的输入

  • 内部命令read:变量取值的另外一种方法

    1. 从标准输入读入一行内容赋值给变量
    2. 例:读取用户的输入,并使用输入的信息。
    1
    2
    3
    $ read name ccp.c 
    $ echo $name ccp.c
    $ ls -l $name -rw-r--r-- 1 jiang usr 32394 May 27 10:10 ccp.c
    1. 可将read写入.sh文件执行,获取输入

环境变量

环境变量和局部变量

  • 默认类型
    所创建的shell变量,默认为局部变量
  • 局部变量转换为环境变量 export proto
  • 局部变量和环境变量
    • shell启动的子进程继承环境变量,不继承局部变量
    • 子进程对环境变量的修改,不影响父进程中同名变量 (环境变量的设置,如PATH,CLASSPATH,LANG,如果必要的话 放在~/.bashrc中或/etc/profile中)

系统环境变量

  • 创建
    • 登录后系统自动创建一些环境变量影响应用程序运行
  • HOME:用户主目录的路径名
  • PATH:命令查找路径
    • 与DOS/Windows不同的是,它不首先搜索当前目录
    • PATH=/bin:/usr/bin:/etc
    • PATH=.:/bin:/usr/bin:/etc 先搜索当前目录 (危险!可能被恶意程序利用)
    • PATH=/bin:/usr/bin:/etc:. 后搜索当前目录 (危险!可能被恶意程序利用)
  • TERM:终端类型 ◆全屏幕操作的软件(如vi),使用它搜索终端库 (环境变量的赋值对某个应用程序,包括java虚拟机以及其他的系统软件,有什么影响,与这 个AP的设计相关,需要查阅相关的手册)

相关命令set/env

  • 内部命令set列出当前所有变量及其值以及函数定义

    • 包括环境变量和局部变量、函数定义
    1
    set | grep ^fname=      #查找fname名称变量
  • 外部命令/bin/env列出环境变量及其值env | more

替换

shell替换

  • Shell的替换工作:先替换命令行再执行命令

    • 文件名生成
    • 变量替换
    • 命令替换
  • 变量替换

    1
    2
    ls $HOME 
    echo "My home is $HOME, Terminal is $TERM"
  • 文件名生成
    遵循文件通配符规则,按照字典序排列
    如:ls *.c文件名替换后实际执行ls a.c x.c

  • shell替换:(反撇号)

    1
    2
    now=`date` #以命令date 的stdout替换`date`
    ./arg `date` #实际执行 ./arg Sun Dec 4 14:54:38 Beijing 2018

    注意:``内部不能有某些字符

  • shell替换: $()格式

    1
    2
    now=$(date) #以命令date 的stdout替换$(date) 
    ./arg $(date) #实际执行 ./arg Sun Dec 4 14:54:38 Beijing 2018
  • shell替换:位置参数

    1
    2
    3
    4
    5
    6
    $0      #脚本文件本身的名字 
    $1 $2 #1号命令行参数,2号命令行参数,以此类推
    $# #命令行参数的个数
    "$*" 等同于"$1 $2 $3 $4 ..."
    "$@" 等同于"$1" "$2" "$3"
    #用于把变长的命令行参数传递给其他命令
  • 内部命令shift 位置参数的移位操作, $#的值减1,旧的$2变为$1,旧的$3变为$2,以此类推 其他用法如:shift 3(移位三个位置

元字符

shell元字符

元字符 功能
空格,制表符 命令行参数的分隔符
回车 执行键入的命令
> < 重定向与管道 (还有
; 用于一行内输入多个命令(还有;; )
& 后台运行 (还有&&)
$ 引用shell变量
` 反向单引号,用于命令替换
* [] ? 文件通配符 (echo "*"与echo *不同)
\ 取消后继字符的特殊作用(转义)
( ) 用于定义shell函数或在子shell中执行一组命令

转义符

  • 反斜线作转义符,取消其后元字符的特殊作用
  • 如果反斜线加在非元字符前面,反斜线跟没有一样

元字符:单引号与双引号

  • 双引号"
    1. 除$和`外特殊字符的特殊含义被取消(保留一定的灵活性)
    2. 需要的转义 \" \$ \\ \`
    3. echo * echo "*"
  • 单引号’
    对所括起的任何字符,不作特殊解释。 系统扫描单引号开始,停止对所有字符的特殊解释,直到再次遇到单引号
    1
    2
    echo "My home dir is $HOME" 
    echo 'My home dir is $HOME'

可能考查:将’'命令修改成同样功能的""