Shell是什么

  • Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以使用Shell来启动、挂起、停止甚至编写一些程序。
  • Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

Shell的分类

  • Shell的梁总主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh。

    • Bourne Shell 
      从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh,非常古老,功能简单的shell。
    • C Shell 
      C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名。
  • Bash 
    Bash 与 sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。

  • Linux中Shell

    • 使用 echo $SHELL查看当前shell。
    • 使用 vim /etc/shells查看Linux支持的shell 。

alias别名

  • 使用alias命令查看当前shell别名
//
#alias
alias ll='ls -l --corlor=auto'
...
  • 在当前shell中设置临时别名alias alias_name='origin_name'
//
#alias vi='vim'
#vi //实际执行vim
  • 删除别名 unalias alias_name
#unalias vi

-当前用户永久配置别名 vi ~/.bashrc

#vi ~/.bashrc
// 添加别名,并保存退出
alias vi='vim'
// 重新加载.bashrc文件到当前shell
#source ~/.bashrc
  • 别名生效顺序

    • 命令生效顺序 
      1. 执行用绝对路径或相对路径的命令
      2. 别名
      3. Bash内部命令
      4. $PATH环境变量定义的目录查找顺序找到的第一个命令

注:别名的优先级高于系统中默认命令

常用快捷键

  • Ctrl+C 强制终止当前命令
  • Ctrl+l 清屏
  • Ctrl+a 光标移动到命令行首
  • Ctrl+e 光标移动到命令行首
  • Ctrl+u 从光标所在位置删除到行首
  • Ctrl+z 把命令放入后台
  • Ctrl+r 在历史命令中搜索

历史命令

history [选项] [历史命令保存文件]

  • options 
    -c : 清空历史命令 
    -w:把缓存中的历史命令写入历史命令保存文件 ~/.bash_history

注: history中历史命令为上次登录时使用的命令,可以使用-w同步写入这次登录后使用的命令

  • 历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile 中修改HISTORYSIZE

历史命令的调用

  • 使用上、下箭头调用以前的历史命令
  • 使用“!n”重复执行第n条历史命令
  • 使用“!!”重复执行上一条命令
  • 使用“!字串”重复执行最后一条以该字符串开头的命令

Tab键补全

使用Tab键补全命令或文件名,一次Tab键未补全时,再次Tab键显示多个补全后命令或文件后从中选择使用的命令或文件,但有时没有该命令或文件时无法完成补全。

**注:**Tab键使用$PATH环境变量中给定的可执行文件的搜索路径中搜索命令

Bash中其他特殊符号

符号 作用
单引号。在单引号中所有的特殊符号,如’$’和’`’(反引号)都没有特殊含义。
“” 双引号。在双引号中特殊符号都没有特殊含义,但是”$”、”`”和”\”是例外,拥有“调用变量的值”、“引用命令”、和“转移符”的特殊含义。
` ` 反引号。在反引号括起来的内容是系统命令,在Bash中会先执行它,和()作用一样,推荐使用(),反引号容易看错。
$() 和反引号作用一样,用来引用系统命令
# 在shell脚本中,#开头行代表注释
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。
\ 转移符。跟在\之后的特殊符号将失去特殊含义,变为普通字符。如 \$将输出 "$"符号,而不当做是变量引用

Shell变量

Shell中变量命名规则

  • 变量名必须以字母或下划线打头,名字中间只能由字母、数字和下划线组成
  • 变量名的长度不得超过255个字符
  • 变量名在有效的范围内必须是唯一的
  • 在Bash中,变量的默认类型都是字符串型

变量的分类

  • 用户自定义变量 
    变量自定义的。
  • 环境变量 
    主要保存和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量的作用是固定的。
  • 位置参数变量 
    主要用来想脚本当中传递参数或数据,变量名不能自定义,变量作用是固定的,也是预定义变量的一种。
  • 预定义变量 
    Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

定义变量

// 变量名=变量值
#x=5 // 注:其间不能有空格 例如x= 5、x =5、x = 5等
// 打印变量
#echo $x
#echo ${x}
  • 变量叠加
#x=123
#x="$x"456
#x=${x}789

变量查看

set可以查看系统下所有变量,包括环境变量和用户变量

// 查看所有变量
#set // 设置此选项,调用未声明变量时报错(默认情况下无任何提示)
#echo $a #set -u
#echo $a
-bash: a: unbound variable

变量删除

unset 变量名

// 删除变量,变量名前不能加$
#unset a

环境变量

环境变量和用户自定义变量的区别? 
用户自定义变量只能在当前shell中生效 
环境变量在当前shell和这个shell的所有子shell中生效

// 进入子shell
# bash
// 查看当前进程树
# pstree
|-
...
|-bash--bash--pstree
...
// 退出子shell
# exit
# pstree
|-
...
|-bash--pstree
..
// 当前shell中定义a
# a=5
# echo $a
5
// 进入子shell
# bash
# pstree
|-
...
|-bash--bash--pstree
...
// 无法查看父shell中的自定义的变量a
# echo $a # eixt
// 父 shell 中导出自定义变量 a,子shell可以看到父shell中的变量
# export $a
# bash
// 子shell中查看变量a
# echo $a
5
// 子shell无法删除父shell定义的变量a
# unset a
# exit
// 父shell删除自定义的变量a
# unset a

查看环境变量

  • set 
    查看所有变量,包括用户自定义变量和系统环境变量
  • env 
    仅用来查看环境变量

PS1环境变量

PS1变量:命令提示符设置

  • \d:显示日期,格式为 “星期 月 日”
  • \H:显示完整的主机名。如默认的主机名”localhost.localhost”
  • \t:显示24小时制时间,格式为“HH:MM:SS
  • \A:显示24小时制时间,格式为“HH:MM”
  • \u:显示当前用户名
  • \w:显示当前所在目录的完整名称
  • \W:显示当前所在目录的最后一个目录
  • $:提示符。如果root用户会显示提示符为“#”,如果普通用户会显示提示符“$”
# echo $PS1
[\u@\h \W]\$

PS2 定义换行提示符如下代码中的“>”

# ls \
>~

当前语系

locale命令查看当前语系

  • LANG:定义系统主语系的变量
  • LC_ALL:定义整体语系的变量
// 查看系统当前语系
# locale
...
# echo $LANG
// 查看Linux系统支持的所有语系
# locale -a |more

查询系统默认语系

cat /etc/sysconfig/i18n,下次开机启动后系统进入的是默认语言环境

# cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"

Linxu中文支持 
前提条件,正确安装中文字体和中文语系

  • 有图形界面,可以正确支持中文显示
  • 第三方远程工具,只要语系设定正确,就可以支持中文显示,XShell选择中文显示
  • 纯字符界面,必须使用第三方插件(如zhcon等)

位置参数变量

// 固定参数个数的求和shell脚本
#/bin/bash
num=$1
num=$2
sum=$(( $num1 + $num2 ))
echo $sum
位置参数变量 作用
$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十个以上的参数需要用大括号包含,如${10}
$* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数
// $*和$@的区别,保存为param.sh
#!/bin/bash
for i in "$*"
do
echo $i
done
for i in "$@"
do
echo $i
done
# chmod u+x param.sh
# ./param.sh 1 2 3 4
1 2 3 4
1
2
3
4

预定义变量

预定义变量 作用
$? 最后依次执行的命令的返回状态。如果这个变量值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确
$$ 当前进程的进程号
$! 后台运行的最后一个进程的进程号(PID)

read

  • options 
    1. -p “提示信息”:在等待read输入时,输出提示信息
    2. -t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
    3. -n 字符数:read命令只接受指定字符数,就会执行
    4. -s:隐藏输入的数据,适用于机密信息的输入

Shell运算符

shell变量的缺点?

  • shell变量是弱类型
  • 默认变量都是字符串

declare声明变量类型

declare来指明声明的变量类型 
declare [+/-][option] 变量名 
options:

  • -:给变量设定类型属性
  • +:取消变量的类型属性
  • -a:将变量声明为数组型
  • -i:将变量声明为整数型
  • -x:将变量声明为环境变量
  • -r:将变量声明为只读变量
  • -p:显示指定变量的被声明的类型
// shell变量默认为字符串
# aa=11
# bb=22
# cc=$aa+$bb
# echo $cc
11+22 // 明确声明变量类型
# declare -i cc=$aa+$bb // 自动转换了$aa、$bb为整型变量参与运算
# echo $cc
33
// 查看指定变量的属性
# declare -p cc
declare -i cc="33"
// 定义数组,shell脚本能够自动检测出这个movie变量是数组
# movie[0]=zp
# movie[1]=tp
# declare -a movie[2]=live # echo ${movie}
# echo ${movie[2]}
# echo ${movie[*]}
// export 调用 declare -x 变量 来声明环境变量
# bb=2
# export bb // export真正调用是declare -x bb=2
# declare -x bb=2 // 查看所有的环境变量
#declare -p
...
declare -x bb=2
...
// 只读属性,变量不能重新赋值、删除、取消只读属性,一般不使用只读属性
# declare -rx test=123
# test=456
-bash: test: readonly variable
# unset test
-bash: test: cannot unset: readonly variable
# declare +r test
-bash: declare: test: readonly variable

数值运算方法

// 上节中数值计算的方式求cc的数值比较复杂,可以使用下面方式
# aa=1
# bb=2
# dd=$(expr $aa + $bb) // 注:$aa和$bb和+ 之间有空格
# echo $dd
// 上面的方式也很复杂
# aa=1
# bb=2
# dd=$(($aa+$bb))
# dd=$[$aa+$bb]

运算符的优先级

注:这里数值越大,优先级越高

变量测试

注:变量测试方式十分简洁但逻辑复杂,也不好记,实际工作中可以查阅;可以使用其他方式实现相同测试结果即可。

Shell基本知识的更多相关文章

  1. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

  2. Linux Shell 基础知识(一)

    1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 ​ GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...

  3. shell从入门到精通进阶之一:Shell基础知识

    1.1 简介 Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户. 下面是处 ...

  4. Shell 基础知识和总结

    调试脚本 检查脚本语法错误 bash -n /path/to/some_script 调试执行 bash -x /path/to/some_script shell里的变量 本地变量:只对当前shel ...

  5. Shell基础知识和编程规范

    一,Shell环境查看 1.1 查看系统Shell支持情况 [root@linux-node1 ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin ...

  6. Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)

    I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量                env:环境变量 常用系统变量: path pwd lang home his ...

  7. shell基础知识总结

    1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...

  8. shell基础知识---与监听服务器长连接端口状态

    从未写过脚本我的最近接了俩脚本的需求,就在这分享一下我的我学到基础知识主要就四部分内容 一.变量 变量的定义 string='字符串' string="字符串" num=808st ...

  9. shell基础知识5-函数

    函数的定义 function fname(){ } 或者 function_name(){ } 对于简单的函数,甚至可以是这样做 fname() { statement; } 函数调用 直接写函数名即 ...

  10. shell基础知识讲解

    第1章 shell基础 1.1 什么叫做shell编程 shell编程也叫做bash高级编程语法 1.2 常见的shell命令解释器 bash            redhat和centos使用 d ...

随机推荐

  1. 面向对象的JavaScript-003

    1. // Since JavaScript doesn't exactly have sub-class objects, prototype is a useful workaround to m ...

  2. EZOJ #257

    传送门 分析 先进行缩点 之后从终点倒着跑 对于一组边如果有一个点不能到达则这组边直接废掉 最后看只用没废掉的边能不能从起点走到终点 代码 #include<iostream> #incl ...

  3. STL中 map 和 multimap

    1. 所在头文件<map>. 命名空间std, 声明如下: namespace std{ template <class Key,class T, class Compare = l ...

  4. Hive 0.12.0安装指南

    目录 目录 1 1. 前言 1 2. 约定 1 3. 服务端口 2 4. 安装MySQL 2 4.1. 安装MySQL 2 4.2. 创建Hive元数据库 2 5. 安装步骤 3 5.1. 下载Hiv ...

  5. SPOJ - AMR11A(DP)

    Thanks a lot for helping Harry Potter in finding the Sorcerer's Stone of Immortality in October. Did ...

  6. SPOJ 8222. Substrings(后缀自动机模板)

    后缀自动机+dp. 后缀自动机主要是在functioner大牛那里学习的:http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html 这道题是在No_st ...

  7. MIDA Converter Basic patched for RAD Studio 10.1.2 Berlin (VCL转换到FMX)

    Mida is the only way to try to convert your project from VCL to FireMonkey. Version after version, M ...

  8. Android-广播概念

    Android中的消息机制 1.Handler+Message消息机制,是用于子线程与主线程的通讯: 2.广播+广播接收者也是消息机制,是重量级别的,四大组件之一,需要激活组件,是用于组件和组件之间通 ...

  9. mybatis 基础教程

    1.引用mybatis.jar包,以后依赖包. 2.配置映射文件(一个是主配置文件,一个是sql映射文件),注意,mapper.xml 文件必须和dao放在一起. 3.mybatis.xml文件说明 ...

  10. oracle数据库中修改已存在数据的字段

    在oracle中,如果已经存在的数据的某些列,假如要更换类型的话,有的时候是比较麻烦的, 会出现:ORA-01439: column to be modified must be empty to c ...