linux_shell基础

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

echo

echo输出的内容如果有空格则需要额外加上引号
感叹号有特殊作用,加双引号不能正确执行,加但引号可以

echo [选项][输出内容]
-e选项支持反斜线控制的字符转换

控制字符 作用
|输出\本身
\a 输出警告音
\b 退格键
\c 取消输出行末的换行符,和"-n"选项一致
\e ESCAPE键
\f 翻页
\n 换行
\r 回车键
\t 制表符
\v 垂直制表符
\0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
\xhh 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数

第一个脚本

#!/bin/Bash
#The first program
#Author: Alex (Email: [email protected])

echo "hello world"

脚本执行

  • 赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
  • 通过bash调用执行脚本
bash hello.sh

历史命令与命令补全

历史命令

history [选项] [历史命令保存文件]
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件"~./bash_history"

注意:

  • 历史命令默认会保存1000条,可以在环境变量配置文件/ect/profile中进行修改
  • 使用上下箭头可以调用以前的历史命名
  • 使用"!n"重复执行第"n"条命令
  • 使用"!!"重复执行上一条命令
  • 使用"!字串"重复执行最后一条以该字串开头的命令

命令补全

在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全

命令别名"alias"

设定别名:alias 别名="原命令"
查询别名:alias

命令执行顺序

  • 第一顺位执行用"绝对路径"或"相对路径"执行的命令。
  • 第二顺位执行别名。
  • 第三顺位执行Bash的内部命令。
  • 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。

让别名永久生效

可以写入到/home/username/.bashrc
理解.bashrc,可查看linux环境变量

删除别名

unalias 别名

Bash 常用快捷键

快捷键 作用
ctrl+A 把光标移动到命令行开头
ctrl+E 把光标移动到命令行结尾
ctrl+C 强制终止当前的命令
ctrl+L 清屏,相当于clear命令
ctrl+U 删除或剪切光标之前的命令
ctrl+K 删除或剪切光标之后的内容
ctrl+Y 粘贴ctrl+U或ctrl+K剪切的内容
ctrl+R 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
ctrl+D 退出当前终端
ctrl+Z 暂停,并放入后台
ctrl+S 暂停屏幕输出
ctrl+Q 恢复屏幕输出

输入输出重定向

标准输入输出

设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/sdtout 1 标准输出
显示器 /dev/sdterr 2 标准错误输出

输出重定向

标准输出重定向

符号 作用
命令 > 文件 覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
命令 >> 文件 追加的方式,把命令的正确输出输出到指定的文件或设备当中

标准错误输出重定向

符号 作用
错误命令 2> 文件 覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
错误命令 2>> 文件 追加的方式,把命令的错误输出输出到指定的文件或设备当中

正确输出和错误输出同时保存

符号 作用
命令 > 文件 2>&1 覆盖的方式,把正确输出和错误输出都保存到同一个文件中去
命令 >> 文件 2>&1 追加的方式,把正确输出和错误输出都保存到同一个文件中去
命令 &> 文件 覆盖的方式,把正确输出和错误输出都保存到同一个文件中去
命令 &>> 文件 追加的方式,把正确输出和错误输出都保存到同一个文件中去
命令 >> 文件1 2>>文件2 把正确输出追加到"文件1"中,把错误输出追加到"文件2"中

注意:"2"等符号之间沒有空格,命令文件等与符号之间可以有空格

输入重定向

  • 把文件作为命令的输入
    命令 < 文件
  • 把标识符之间内容作为命令的输入
命令 << 标识符
...
标识符

举例:
wc [选项] [文件名]
-c 统计字节数
-w 统计单词数
-l 统计行数

多命令的顺序执行

多命令顺序执行

多命令执行符 格式 作用
; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1&&命令2 逻辑与:1执行,2才会执行;1执行不正确,2不会执行
|| 命令1||命令2 逻辑或:1执行,2不会执行;1执行不正确,2执行

管道符

命令1作为命令2的操作对象
命令1|命令2
例如:cat file|pager 分页显示

grep搜索

grep [选项] "搜索内容" 文件名
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
--color=auto 搜索出的关键字用颜色显示

通配符与其他符号

通配符

通配符 作用
? 匹配任意一个字符
* 匹配0个或任意多个字符,也就是任意内容
[ ] 匹配中括号中任意一个字符,例如:[ab]就是匹配a或b
[-] 匹配中括号中一个字符,例如:[a-c]就是匹配a,或b,或c
[^] 逻辑"非"匹配不是括号中的一个字符

bash中的其他符号

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

例子:

$ echo "date"
date
$ echo "$(date)"
Mon Jul 31 14:52:54 CST 2017
$ greet="hello linux"
$ echo greet
greet
$ echo $greet
hello linux

用户自定义变量

变量

变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。

变量设置规则

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的
  • 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
  • 变量用等号连接值,等号左右两侧不能有空格
  • 变量的值如果有空格,需要使用单引号或双引号包括。
  • 在变量的值中,可以使用“\”转义符。
  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
  • 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
  • 环境变量名建议大写,便于区分。

变量分类

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

本地变量(用户自定义变量)

变量定义
$ name="alex zhang"
变量叠加
$ aa=123
$ aa="$aa"456
$ aa=${aa}789
变量调用
$ echo $name
变量查看
$ set
变量删除
$ unset name

环境变量

用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。

设置环境变量

一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。export将变量申明为全局变量

  • 申明变量:export 变量名=变量值 或者 export 本地变量名,申明该本地变量为环境变量
  • 查询变量:env
  • 删除变量:unset 变量名

系统常见环境变量

PATH:系统查找命令的路径
PATH变量叠加:PATH="$PATH":/username/project

三种修改环境变量的方式

  • PATH="$PATH":/username/project 直接叠加环境变量,临时有效
  • vi /etc/profile 在适当位置添加PATH="$PATH":/username/project,所有用户有效
  • vi ~/.bash_profile 修改PATH行,添加PATH="$PATH":/username/project,当前用户有效

注意:

/username/project添加到环境变量,该目录下的脚本文件可以直接执行,而不再需要”绝对路径“或”相对路径“,比如正常需要执行脚本文件”hello.sh“需要chmod 755 hello.sh然后./hello.sh/username/project/hello.sh才能执行,这时只需hello.sh就可直接执行

PS1定义系统提示符的变量

\d:显示日期,格式为“星期 月 日”
\h:显示简写主机名。如默认主机名“localhost”
\t:显示24小时制时间,格式为“HH:MM:SS”
\T:显示12小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户
会显示提示符为“$”

例子:

alex@alex-zh ~ $ PS1='[\u@\t \w]\$ '
[alex@16:14:28 ~]$ PS1='[\u@\t \#\w]\$ '
[alex@16:14:59 20~]$ PS1='\u@\H \w \$ '
alex@alex-zh ~ $ 

位置参数变量

位置参数 作用
$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
$* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数

例子:

#!/bin/bash
#
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum

$*$@区别

$* 中的所有参数看成是一个整体,所以这个 for 循环只会循环一次
$@ 中的每个参数都看成是独立的,所以“ $@ ”中有几个参数,就会循环几次

Bash运算符

数值运算与运算符

linux Shell中,所有变量默认为字符串

declare声明变量类型
declare [+/-][选项]变量名
选项 变量
- 给变量设定类型属性
+ 给变量取消类型属性
-i 将变量声明为整数型
-x 将变量声明为环境变量
-p 显示指定变量的被声明类型

选项:

选项 变量
- 给变量设定类型属性
+ 给变量取消类型属性
-i 将变量声明为整数型
-x 将变量声明为环境变量
-p 显示指定变量的被声明类型

数值运算

  • 方法1
$ aa=11
$ bb=22
$ declare -i cc=$aa+$bb    # 声明为整数型
  • 方法2:expr或let数值运算工具
$ aa=11
$ bb=22
$ dd=$(expr $aa + $ bb)  # dd是aa和bb值的和,“+”号左右有空格
  • 方法3:$((运算式))或$[运算式]
$ aa=11
$ bb=22
$ ee=$(($aa+$bb))
$ ff=$[$aa+$bb]

运算符

优先级 运算符 说明
13 -, + 单目负、单目正
12 !, ~ 逻辑非、按位取反或补码
11 *, /, % 乘除取模
10 +, - 加,减
9 <<, >> 按位左移、按位右移
8 < =, > =, <, > 小于或等于、大于或等于、小于、大于
7 ==, != 等于、不等于
6 &按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 +, =, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= 赋值、运算且赋值

变量测试与内容替换

变量置换方式 变量y没有设置 变量y为空值 变量y设置值
x=${y-新值} x=新值 x为空 x=$y
x=${y:-新值} x=新值 x=新值 x=$y
x=${y+新值} x为空 x=新值 x=新值
x=${y:+新值} x为空 x为空 x=新值
x=${y=新值} x=新值;y=新值 x为空;y值不变 x=$y;y值不变
x=${y:=新值} x=新值;y=新值 x=新值y=新值 x=$y;y值不变
x=${y?新值} 新值输出到标准错误输出(就是屏幕) x为空 x=$y
x=${y:?新值} 新值输出到标准错误输出 新值输出到标准错误输出 x=$y

环境变量配置文件

环境变量会在一系列shell中有效,本地变量在本shell窗口有效。环境变量比本地变量适用范围多一些,修改环境变量文件永久性的更改环境变量

source命令
修改了配置文件,需要退出再重新登陆才能生效。而source或者“.”避免了这个过程
用法1:source 配置文件
用法2:. 配置文件

  • /etc/profile
    • 作用:USER变量,LOGNAME变量,MAIL变量,PATH变量,HOSTNAME变量,umask
    • 调用/etc/profile.d/*.sh
  • /etc/profile.d/*.sh
    • 所有".sh"结尾的文件
  • ~/.bash_profile
    • home目录,对当前用户有效
    • 调用~/.bashrc
    • 在PATH变量后面加入了:$home/bin这个目录
  • ~/.bashrc
    • home目录,当前用户有效
    • 定义默认别名
    • 调用/etc/bashrc
  • /etc/bashrc
    • PS1 变量
    • umask
    • PATH变量
    • 调用/etc/profile.d/*.sh

你可能感兴趣的:(linux_shell基础)