Shell 基本语法结构(1):变量

1. Shell 分类

不同的shell具备不同的功能,流行的shell有ash、bash、zsh、ksh、csh等,不同的shell都有自己的特点以及用途。可以通过查看/etc/shells文件中的内容来查看当前主机中包含哪些类型的Shell

# chen @ localhost in ~/Shell [10:34:21] 
$ cat /etc/shells
/bin/sh # 是bash的一个快捷方式
/bin/bash # 大多数linux默认的shell,包含的功能几乎覆盖shell所有的功能
/sbin/nologin # 表示非交互,不能登录操作系统
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/bin/zsh # 功能非常强大,zsh已经取代bash 成为macOS Catalina的默认shell

2. Shell 基本语法结构

2.1. 变量定义

2.1.1. 变量名规则
  • 区分大小写
  • 不能包含特殊符号
  • 不能以数字年开头
  • 等号两边不能有空格
2.1.2. 交互式定义变量 (read)
  • 语法:read [选项] 变量名

  • 选项

    • -[p] 定义提示用户信息
    • -[n] 定义字符数,限制变量的长度
    • -[s] 不显示用户输入的内容。常用于密码输入
    • -[t] 定义超时时间,默认单位为秒(限制用户输入变量值的时间)
  • 场景

    • 用户自定义变量
      [chen@localhost Shell]$ read -p "hello: " name
      hello: chen
      [chen@localhost Shell]$ echo ${name}
      chen
      [chen@localhost Shell]$ zsh
      
    • 变量值来自文件,每次调用 read 命令都会读取文件中的一行文本
      [chen@localhost Shell]$ read -p "file1:  " f < file1 
      [chen@localhost Shell]$ echo ${f}
      name
      
  • 问题?
    在我电脑上 bash 环境中 read 可以正常使用,切换到 zsh 时 ,read 出现异常 read: -p: no coprocess???

    [chen@localhost Shell]$ zsh
    
    # chen @ localhost in ~/Shell [11:11:35] 
    $ read -p "hello: " name
    read: -p: no coprocess
    
2.1.3. 定义有类型的变量 (declare)
  • 目的:给变量做一些限制,固定变量的类型,比如:整形、只读
  • 语法:declare [选项] 变量名=变量值
  • 常用选项:
    • -i 将变量视为整数
    • -r 只读变量
    • -a 定义普通数组,查看普通数组
    • -A 定义关联数组,查看关联数组
    • -x 将变量通过环境导出
2.1.4. 本地变量

当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效

	# chen @ localhost in ~/Shell [11:21:28] 
$ A=hello

# chen @ localhost in ~/Shell [11:21:42] 
$ echo ${A}
hello
# chen @ localhost in ~/Shell [11:21:47] 
$ zsh # 开起一个子进程
# chen @ localhost in ~/Shell [11:22:26] 
$ echo ${A} # 变量无效

2.1.5. 环境变量

当前进程中有效,并且可以被当前进程的子进程调用

  • env 查看当前用户的环境变量

  • set 查询当前用户的所有变量

  • export 变量名=变量值

    # chen @ localhost in ~/Shell [11:27:23] 
    $ export name=chen
    # chen @ localhost in ~/Shell [11:28:31] 
    $ env | grep name
    name=chen
    # chen @ localhost in ~/Shell [11:30:57] C:1
    $ declare -x age=13
    # chen @ localhost in ~/Shell [11:31:07] 
    $ env | grep age
    age=13
    # chen @ localhost in ~/Shell [11:32:42] 
    $ zsh    #环境变量可以被当前进程的子进程调用     
    # chen @ localhost in ~/Shell [11:32:55] 
    $ echo ${name}
    chen
    
2.1.6. 全局变量

全局所有的用户和程序都能调用,且继承。新建用户默认也可以调用

  • $HOME/.bashrc:当前用户的 bash 信息,用户登录时读取,用于定义别名、umask、函数等
  • $HOME/.bash_profile:当前用户的环境变量,用户登录时读取
  • $HOME/.bash_logout:当前用户退出当前 shell 时最后读取,用于定义用户退出时执行的程序等
  • /etc/bashrc:全局的 bash 信息,所有用户都生效
  • /etc/profile: 全局环境变量信息,系统和所有用户都生效

说明:

  • 以上文件修改后,都需要重新 source 让其生效或者重新推出登录

  • 用户登陆系统读取相关文件顺序

  1. /etc/profile
  2. $HOME/.bash_profile
  3. $HOME/.bashrc
  4. /etc/bashrc
2.1.7. 系统变量

shell 本身已经固定好了它的名字和作用

  • $? 上一条命令执行返回的转态;状态值为0表示正常执行。非0表示异常或错误
  • $0 当前执行的程序或脚本名
  • $# 脚本后面的参数个数
  • $* 脚本后面所有参数,参数作为一个整体输出。每一个变量参数之间以空格隔开
  • $@ 脚本后面的所有参数,参数是独立的,也是全部输出
  • $1-$9 脚本后面的位置参数,$1表示第一个位置参数
  • ${10}-${n}扩展位置参数,第10个位置变量必须用{}大括号括起来
  • $$当前所在进程的进程号
  • $!后台运行的最后一个进程后(当前终端)
  • !$调用最后一条历史命令中的参数

2.2. 变量内容的删除和替换

  • 一个 % 代表从右往左去掉一个/key/
  • 二个 %% 代表从右往左最大去掉/key/
  • 一个 # 代表从左往右去掉一个/key/
  • 二个 ## 代表从左往右最大去掉/key/
# chen @ localhost in ~/Shell [12:06:56] 
$ url=www.taobao.com
# chen @ localhost in ~/Shell [12:07:14] 
$ echo ${#url} # 变量长度
14
# chen @ localhost in ~/Shell [12:07:19] 
$ echo ${url#*.} # 从左到右删除第一个'.*'的内容
taobao.com
# chen @ localhost in ~/Shell [12:15:24] 
$ echo ${url%.*}
www.taobao
# chen @ localhost in ~/Shell [12:13:25] 
$ echo ${url%.*}
www.taobao
# chen @ localhost in ~/Shell [12:14:13] 
$ echo ${url##*.}
com
# chen @ localhost in ~/Shell [12:14:28] 
$ echo ${url%%.*}
www

你可能感兴趣的:(Linux)