一、linux终端及bash的基本特性

GUI     图形化界面,例如 KDE , GNOME , Xfce

CLI     命令行界面,例如 /etc/shells 包括 bash zsh 和 csh

bash的基本特性

1、命令行展开  ~:自动展开为用户的家目录,或指定的用户的家目录;{}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;

2、alias别名

通过alias命令实现

   (1)alias:显示当前shell进程所有可用的别名

   (2)alias = NAME=‘VALUE’:定义别名为NAME,代表的命令是VALUE,在命令行定义的别名,只对当前shell进程有效,如果想永久有效,需要定义在配置文件中。

3、文件名通配机制

bash中用于实现文件名通配:*  ?   [ ]   ^

      (1)*    任意长度的任意字符:

      (2)?  任意单个字符:   

      (3)[ ]   匹配指定范围内任意单个字符:

      (4)^     匹配指定范围外的任意单个字符:

      专用字符集合:

        [:digit:]      任意数字

        [:lower:]    任意小写字母

        [:upper:]    任意大写字母

        [:alpha:]     任意字母

        [:alnum:]    任意数字或字母

        [:punct:]     任意标点符号

        [:space:]     空格

4、命令历史

shell进程会在其会话中保存此前用户提交执行过的命令;

5、快捷键

ctrl+a:跳转至命令行行首

ctrl+e:跳转至命令行行尾

ctrl+c:取消命令的执行

ctrl+w: 移除光标前的一个单词

Ctrl+u:删除行首至光标所在处之间的所有字符

ctrl+k:删除光标所在处至行尾的所有字符

Ctrl+l:清屏,相当于clear

6、命令补全,路径补全

1.命令查找和补全机制:

  • 查找内部命令;
  • 根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;
  • 给定开头的部分字符串如果能惟一标识某命令程序文件,则直接补全;

              如果不能惟一标识某命令程序文件,再击tab键一次,会给出列表;

2.路径补全

在给定起始路径下,以对应路径下的打头字串逐一匹配起始路径下每个文件,tab按键; 如果能惟一标识,则直接补全;

二、bash的基本特性续

1、命令hash介绍

       确定并记住每个给定NAME名称的命令的完整路径,它是一个内部命令,可以使用type  hash进行验证

hash命令,  

hash  ,列出缓存命令

hash  -d  command   删除缓存命令的特定条目,只需要跟命令即可

hash  -r     清除缓存命令

比比叨叨

不拉不拉

得比得比

an  hour  later...

2、bash变量介绍

程序是由指令加数据组成的

指令需要由程序文件提供

数据的来源

linux系统的数据获取方式,IO设备、文件、管道、变量

linux系统当中变量的类型

本地变量,作用域仅为当前shell进程;

环境变量,作用域为当前shell进程及其子进程;

局部变量,作用域仅为某代码片断(函数上下文);

位置参数变量,当执行脚本的shell进程传递的参数;

特殊变量,shell内置的有特殊功用的变量;

shell变量赋值方式   name=value  ,变量的存储类型,有字符串和数字2种

bash是弱类型的脚本编程语言,然后会将所有的变量认为是字符串类型,并且,变量在脚本当中无需事先声明,可以直接对新创建的变量赋值即可,例如  ip=172.16.0.100  ,变量的引用方式为${},其中{}部分是可以省略的,那么echo   $ip    ,就可以打印出ip这个变量的值

变量设置规则:

  1、变量名称可以由字母,数字和下划线组成,但是不能以数字开头,环境变量名建议大写,便于区分。

  2、在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。

  3、变量用等号连接值,等号左右两侧不能有空格。

  4、变量的值如果有空格,需要使用单引号或者双引号包括。

用例

1、打印变量ip的值

# ip=172.16.0.100

# echo $ip

172.16.0.100

老婆嘴,毒舌,尖酸刻薄,夹枪带棒,不务正业,误人子弟,舌灿莲花,东拉西扯,跑题?

   

     这图并不一定能精确描述我到底要说什么,我不知道你能不能大体上理解这一概念?我不知道各位能不能理解?

我们都是文曲星下凡,请继续你的表演...

那我们以前一直在讲,叫一个一个什么东西的作用域...

bash变量类型,本地变量有效范围是当前shell进程。环境变量,有效范围是当前shell进程及子进程

。局部变量,一般是在脚本的一部分代码范围内。

位置参数变量,当执行脚本的shell进程传递的参数。特殊变量,shell内置的特殊作用的变量,这个比较好理解,系统自带的,shell内置的环境变量。

在bash编程当中,变量的引用,双引号是弱引用,变量名会替换为他所代表的的的值,但是单双引号是强引用,不会替换。

2、环境变量的设置及取消

# ip=172.16.0.100

# echo $ip

172.16.0.100

# unset ip

# echo $ip

环境变量的赋值方式

export    name=value  同样还可以有第二种方式  declare   -x    name=value

bash内嵌了许多环境变量,通常为全大写字符串,用于定义bash的工作环境。

3、查询系统中常见的环境变量

# echo $SHELL

/bin/bash

# echo  $PWD

/root

# echo $UID

0

# echo $HOME

/root

查看当前系统的环境变量  export  ,declare  -x,env

撤销环境变量,unset   name

4、定义环境变量,然后设置变量为只读

# declare -x hy=henyuan

# declare -r hy

# hy=huoying

-bash: hy: readonly variable

只读变量无法重新赋值,并且不支持撤销,存活时间为当前shell进程的生命周期,随着shell进程终止而终止,如果想同时执行多个命令,可以使用分号进行分割

逻辑运算,

布尔值  真假

与,或,非,异或

短路法则。

对于要执行的     #命令1  && 命令2     ,如果命令1为假,那么命令2是不会执行的;如果命令1为真,那么命令2必须要执行

对于要执行的     #命令1  || 命令2     ,如果命令1为真,那么命令2是不会执行的;如果命令1为假,那么命令2必须要执行

# 如果可以创建文件,那么就将date的输出结果覆盖重定向此文件

# touch /tmp/document && date +%F-%H:%M:%S >/tmp/document  

# cat /tmp/document

2021-03-11-15:20:32

回顾,显示当前的日期时间命令  

# date +%Y-%m-%d-%H:%M:%S    

# date +%F-%H:%M:%S

# 判断用户scott是否存在,如果没有那么就创建此用户,并且设置密码同用户名

# id  scott   ||  useradd  scott  ;echo "scott"  | passwd --stdin   scott

id: scott: no such user

Changing password for user scott.

passwd: all authentication tokens updated successfully.




三、shell脚本编程

编译型语言和解释型语言

1、编译型语言

需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。

优点是编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。

同样缺点也比较明显,编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。

代表语言:C、C++、Pascal、Object-C以及最近很火的苹果新语言swift

2、解释型语言

解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。

优点是有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。

缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。

代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

面向过程式编程语言和面向过程式编程语言介绍

面向过程:是一种以过程为中心的编程思想。都是以什么正在发生为主要目标进行编程。

面向对象语言:是一类以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。

Shell是命令解释器(command interpreter),是Unix操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作系统内核(kernel)能够识别的指令,并且操作系统内核执行完将返回的输出通过shell再呈现给用户,下图所示用户、shell和操作系统的关系:

Shell也是一门编程语言,即shell脚本,shell是解释执行的脚本语言,可直接调用linux命令。 .java -> .class

  一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的。

shell脚本编程,同传统的编程语言一样,shell提供了很多特性,这些特性可以使你的shell脚本编程更为有用。

shell脚本的行文规范

首行,第一行内容在脚本的首行左侧,表示脚本将要调用的shell解释器,内容如下:

    #!/bin/bash

    #!符号能够被内核识别成是一个脚本的开始,这一行必须位于脚本的首行,/bin/bash是bash程序的绝对路径,在这里表示后续的内容将通过bash程序解释执行。

注释,注释符号# 放在需注释内容的前面,如下面代码的第三行所示。

# vim /tmp/first.sh

#!/bin/bash

#my  first  shell   scripts

cat > /tmp/timo   <<EOF

fushanxing

2012

fuchouzhelianmeng

jisufeiche

suduyujiqing

gesila

yitiaogoudeshiming

xman

zhuluoji

heibao

duye

EOF

内容,可执行内容和shell结构

在linux系统当中,文本编辑器有很多,行编辑器有sed,全屏编辑器有nano  ,vim等。

nano介绍

1、这里介绍一款简单的文本编辑器nano,nano 是一个字符终端的文本编辑器,有点像DOS下的editor程序,比较适合Linux初学者使用

# yum -y install nano

# nano   a.txt

2、然后就会打开一个窗口,显示编辑界面,上面这个命令会新建一个名为 a.txt 的文件,然后就可以输入自己的内容

3、保存,在我们输入一个内容之后,可以使用 CTRL+O 组合键保存文本(终端下方有相关快捷键的提示)

4、退出,使用 CTRL+X 就可以退出编辑(编辑器下面提示的)。

用例

1、写一个简单的脚本

# vim  /tmp/simple

#!/bin/bash

id  xiayu   &> /dev/null  ||   useradd xiayu

echo "chuntian"  | passwd --stdin xiayu

mktemp -d /tmp/xiayu.XXXX

echo "the  weather of today is rain  and  today is \"

date +%F-%H:%M:%S

# chmod u+x  /tmp/simple

# echo  $PATH

//给文件的属主加上执行权限

# /tmp/simple    

Changing password for user xiayu.

passwd: all authentication tokens updated successfully.

/tmp/xiayu.1ITl

the  weather of today is rain  and  today is

2021-03-12-10:45:13

文件需要有执行权限,才能够运行,注意,一定要写成 ./simple.sh,而不是 simple.sh,运行其它二进制的程序也一样,直接写 simple.sh,linux 系统会去 PATH 里寻找有没有叫 simple.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 simple.sh 是会找不到命令的,要用 ./simple.sh 告诉系统说,就在当前目录找。

有些命令如果重复执行就会报错,所以需要用程序逻辑来判断运行条件是否满足,以避免其运行中发生错误。当然也可以直接指定解释器运行此脚本   bash    /tmp/simple

用例

1、 显示/tmp/music目录下,所有以大写M或者小写m开头的文件

显示/etc/下所有文件及目录,并将小写字母转换为大写

创建临时文件/tmp/sandstorm.XXXXXX

#  mkdir    /tmp/scripts/

# cat  >  /tmp/scripts/list.sh  << EOF

#!/bin/bash

ls  -d   /tmp/music/[Mm]*

ls  -d  /etc/* | tr  'a-z'   'A-Z'

mktemp  /tmp/sandstorm.XXXXXX

EOF

#  bash   /tmp/scripts/list.sh

bash的配置文件有两类,第一类是profile  ,主要是为交互式登录的shell提供配置,例如通过终端输入账号密码后登录的shell进程,还有就是su  -  切换的用户,登录的shell进程。

首先是全局有效的配置文件,对所有的用户都有效,有两种,第一种是/etc/profile,第二种是/etc/profile.d/*.sh文件;第二种是针对用户个人的配置文件,只对当前用户有效,其配置文件的位置为家目录下的/.bash_profile,profile类的配置文件作用有用于定义环境变量,用来运行命令或者脚本。

第二类是bashrc,为非交互式登录的shell进程提供配置,它主要表现在,su  + 用户名  ,执行的用户切换,另外在图形界面下打开的终端,均是非交互式登录。shell脚本是在子shell当中运行的

bashrc类的系统配置文件,也分为2种,第一种为全局有效的配置文件,/etc/bashrc ,用户个人的配置文件为家目录下的/.bashrc文件,bashrc类的配置文件作用是定义本地变量,定义命令别名

当然了,只有管理员有权限修改全局配置文件,

在交互式登录shell进程中配置文件的读取顺序是这样的

1、/etc/profile

2、/etc/profile.d/*.sh

3、~/.bash_profile

4、~/.bashrc

5、/etc/bashrc

在非交互式登录shell进程当中,配置文件读取过程如下

1、~/.bashrc

2、/etc/bashrc

3、/etc/profile.d/*

在命令行中定义的特性,例如变量和别名作用域为当前shell进程的生命周期,

配置文件定义的特性,有效范围是重新启动的shell进程,如果想让其立即生效,有两种方式,第一种为通过命令行重复定义一次,第二种为让shell进程重读配置文件

让shell进程重读配置文件的方式有两种方式,第一种为  source  +   配置文件路径;第二种方式为     点  .  +   绝对路径配置文件

用例:

1、定义一个命令别名,立刻生效,此操作在系统重启后一样有效

# cat >  ~/.bashrc  <<EOF

alias cdnt='cd /etc/sysconfig/network-scripts'

EOF

# source ~/.bashrc

# alias

alias cdnt='cd /etc/sysconfig/network-scripts'

alias cp='cp -i'

...

2、在脚本文件中定义登录提示,当用户登录时提示设备SN,当前日期

查看win下服务器硬件的SN

wmic bios get serialnumber

linux系统下服务器硬件SN查询,服务器型号

# dmidecode -t system | grep 'Serial Number'

# dmidecode | grep "Product"

# cat > /etc/profile.d/sndate.sh  <<EOF

dmidecode -t system | grep 'Serial Number'

date +%F-%H:%M:%S

EOF

# su - yangtree

/sys/firmware/dmi/tables/smbios_entry_point: Permission denied

/dev/mem: Permission denied

2021-03-17-10:37:49

//当然yangtree是普通用户,所以第一条命令执行失败

$ su - root

Password:

Last login: Wed Mar 17 09:41:19 CST 2021 from 192.168.8.104 on pts/0

       Serial Number: VMware-56 4d ee fa f6 a1 94 48-1b 55 17 5b 97 a4 f0 da

2021-03-17-10:40:09

3、定义环境变量JAVA_HOME

# cat > /etc/profile.d/java.sh  <<EOF

export  JAVA_HOME='/usr/local'

EOF

# . /etc/profile.d/java.sh

//注意命令首行的点号

# export

//查看刚定义的环境变量


更多相关文章

  1. 3.1 Ansible Playbooks 高级一
  2. 每天学一个 Linux 命令(29):tail
  3. 每天学一个 Linux 命令(28):ln
  4. 每天学一个 Linux 命令(27):head
  5. 每天学一个 Linux 命令(26):less
  6. 每天学一个 Linux 命令(25):more
  7. JavaScript变量中你不知道的几个小埋伏!
  8. Java怎么配置环境变量?
  9. 记录shell脚本中的特殊变量

随机推荐

  1. Android Studio安卓学习笔记(二)Android
  2. Android外设AOA技术原理
  3. Android(安卓)之窗口小部件高级篇--App W
  4. Android中自己定义一个shade.xml
  5. android与ios之争之我见
  6. Android查看外部依赖jar的源码'Android P
  7. Android自适应屏幕大小和layout布局(横屏
  8. [置顶] android利用jni调用第三方库——
  9. Android应用开发揭秘(半年重印4次,内容已
  10. 河北Android手机平台开发