linux_shell基础

2017-08-20  本文已影响0人  tf_dejs

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: Alex@example.com)

echo "hello world"

脚本执行

chmod 755 hello.sh
./hello.sh
bash hello.sh

历史命令与命令补全

历史命令

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

注意:

命令补全

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

命令别名"alias"

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

命令执行顺序

让别名永久生效

可以写入到/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脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。

变量设置规则

变量分类

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

变量定义
$ 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将变量申明为全局变量

系统常见环境变量

PATH:系统查找命令的路径
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 显示指定变量的被声明类型

数值运算

$ aa=11
$ bb=22
$ declare -i cc=$aa+$bb    # 声明为整数型
$ aa=11
$ bb=22
$ dd=$(expr $aa + $ bb)  # dd是aa和bb值的和,“+”号左右有空格
$ 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:. 配置文件

上一篇下一篇

猜你喜欢

热点阅读