linux

45 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情

Shell特殊变量

变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量

特殊变量列表

变量含义
$0当前脚本的文件名s
$n传递给脚本或函数的参数.n 是一个数字,表示第几个参数
$#传递给脚本或函数的参数个数.
$*传递给脚本或函数的所有参数.
$@传递给脚本或函数的所有参数.被双引号(" ")包含时,与 $* 稍有不同
$?上个命令的退出状态,或函数的返回值.
$$当前Shell进程ID.对于 Shell 脚本,就是这些脚本所在的进程ID.
  • 实例
        vim 3.sh
    
        #!/bin/bash
        echo "文件名是: $0"
        echo "第1个参数是: $1"
        echo "第2个参数是: $2"
        echo "所有的参数是: $@"
        echo "所有的参数是: $*"
        echo "参数的数量为: $#"
    
        [llllljian@llllljian-virtual-machine 20180524]$ bash ./3.sh a b c d e
        文件名是: ./3.sh
        第1个参数是: a
        第2个参数是: b
        所有的参数是: a b c d e
        所有的参数是: a b c d e
        参数的数量为: 5
    
        vim 1.sh
    
        #!/bin/bash
        
        for var in "$*"
        do
        echo "$var"
        echo "------------------------"
        done
        
        echo "========================"
        
        for var in "$@"
        do
        echo "$var"
        echo "------------------------"
        done
    
        ./1.sh "a" "b" "c" "d"
        a b c d
        ------------------------
        ========================
        a
        ------------------------
        b
        ------------------------
        c
        ------------------------
        d
        ------------------------
    

学习BASH

我的理解是 bash与shell的关系类似于ubuntu与Linux的关系,都是后者的一部分

bash功能

  • 记录历史命令:bash可以记录曾经的命令,保持在~/.bash_history文件中,只保存上次注销登录之后的命令
  • tab键自动补全:使用tab见可以自动不全命令或者目录i
  • alias命令别名:可以使用alias ll='ls -al'来设置命令的别名
  • 工作控制:可以将某些任务放在后台去运行,这里不多种介绍
  • 程序脚本:可以执行shell脚本文件
  • 通配符:在查找相关文件或者执行相关命令时,可以使用通配符*
  • 内建命令type:可以使用type 命令来查看某个命令是否为内建在bash当中的命令

type查询指令是否为bash shell的内建命令

  • type
    • 命令格式
      • type(选项)(参数)
    • 命令功能
      • 显示指定命令的类型,判断给出的指令是内部指令还是外部指令
    • 命令参数
      • -t: 输出“file”、“alias”或者“builtin”,分别表示给定的指令为“外部指令”,“命令别名”或者“内部指令”;
      • -p: 如果给出的指令为外部指令,则显示其绝对路径;
      • -a: 在环境变量“PATH”指定的路径中,显示给定指令的信息,包括命令别名.

指令的下达与快速编辑按钮

  • \
    • 命令太长\ Enter可以跳到下一行
  • ctrl+u
    • 删除光标之前的指令串
  • ctrl+k
    • 删除光标之后的指令串
  • ctrl+a
    • 让光标移动到整个指令串的最前面
  • ctrl+e
    • 让光标移动到整个命令串的最后面

shell的变量功能

  • 环境变量[全局变量]
    • export 变量名=变量值
    • 在子程序中仍然有效[当前bash我们称之为父程序,在整个bash下执行的任何程序都成为子程序]
  • 自定义变量[局部变量]
    • 变量名=变量值
    • 局部变量只在当前程序中有效
  • 实例
        name1=llllljian1
        export name2=llllljian2
    
        vim 1.sh
    
        echo $name1
        echo $name2
    
        ./1.sh
    
        kong
        llllljian2ss
    
  • 变量设定规则
    • 变量与内容以一个等号 [=] 来连接,
    • 等号两边不能直接空格符,如下所示为错误:
    • 量名称只能是英文字母与数字,但是开头字符不能是数字,
    • 变量内容若有空格符可使用双引号["]或单引号[']将变量内容结合起来,但双引号内的特殊字符如$等,可以保有原来的特性,单引号内的特殊字符则仅为一般字符(纯文本),如下所示:
    • 可用跳脱字符[ \ ]将特殊符号(如 [Enter],$,,空格符,'等)变成一般字符
    • 在一串指令的执行中,还需要籍由其他额外的指令提供的信息时,可以使用反单引号[指令]或[$(指令)].
    • 若该变量为扩增变量内容时,则可用 “变量名称”或变量名称” 或 {变量} 累加内容
    • 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量:
    • 通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断(纯粹依照使用者兴趣与嗜好);
    • 取消变量的方法为使用 unset : [uset 变量名称]
  • 定义变量
    • 定义变量时,变量名不加美元符号($)
    • 需要遵守的规则
      • 首个字符必须为字母(a-z,A-Z).
      • 中间不能有空格,可以使用下划线(_).
      • 不能使用标点符号.
      • 不能使用bash里的关键字(可用help命令查看保留关键字).
  • 使用变量
    • 使用一个定义过的变量,只要在变量名前面加美元符号($)即可
    • 推荐变量左右加上花括号,便于查看
  • 重新定义变量
    • 已定义的变量,可以被重新定义
        myUrl="http://see.xidian.edu.cn/cpp/linux/"
        echo ${myUrl}
        myUrl="http://see.xidian.edu.cn/cpp/shell/"
        echo ${myUrl}
    
  • 只读变量
    • 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
  • 删除变量
    • 使用 unset 命令可以删除变量
  • 变量类型
    • 局部变量
      • 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量.
    • 环境变量
      • 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行.必要的时候shell脚本也可以定义环境变量.
    • shell变量
      • shell变量是由shell程序设置的特殊变量.shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行