Linux 脚本语言Shell基础
1. Shell 概述
1.1 Shell 是一个命令行解释器,向系统内核发送请求
-
硬件
-
内核
-
Shell 命令解释器
-
外层应用程序 ( ls、ps、yum)
1.2 Shell 功能强大的编程语言
-
Shell 是解释执行的脚本语言,所见即所得,写完回车就能看到结果。
-
Shell 可以直接调用Linux系统命令。
1.3 Shell分类
-
Bourne Shell : 从1979年开始使用,主文件识别为sh
- Bourne 家族主要包括: sh、ksh、Bash、psh、zsh
-
C Shell : 主要在BSD版的Unix系统中使用,语法和C语言相似
- C 家族主要包括:csh、tcsh
注意:
-
Bash 与 sh 兼容,现在使用的 Linux 就是使用 Bash 作为用户的基本Shell。
-
绝大多数命令(ls、cd、cp)都是二进制可执行文件,计算机直接可以识别。
1.4 Linux支持的Shell
# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
# sh //使用sh
# exit //退出sh,继续使用bash
# vim /etc/passwd //用户信息文件
2. Shell 脚本执行方式
赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
通过Bash调用执行脚本
bash hello.sh
#!/bin/bash
#author (1404488@qq.com)
echo "hello world"
注意:
Linux中回车符识别为 $
。
Windows中为 ^M$
。
# cat -A hello.sh //可以看到所有的隐藏符号
将Windows的文件转换为Linux文件
# dos2unix hello.sh //安装yum -y install dos2uinx
将Linux的文件转换为Windows文件
# unix2dos hello.sh
3. Bash 基本功能
3.1 历史命令与命令补全
历史命令
history
[选项] [保存的文件]
-c
//清空历史命令-w
//把缓存的历史命令写入历史命令保存文件~/.bash_history
注意:
历史命令文件默认会在 /root/.bash_history
。
可以在 /etc/profile
中修改默认保存的数目。
命令补全
“Tab
” 键会自动进行补全。
3.2 命令别名与常用快捷键
命令别名
alias
#设置别名
# alias vi='vim'
# vi /root/.bashhrc //让别名永久生效
unalias
#删除别名
常用快捷键
快捷键 | 作用 |
---|---|
CTRL + L | 清屏 |
CTRL + U | 剪切光标之前的命令 |
CRTL + K | 剪切光标之后的命令 |
CTRL + Y | 粘贴内容 |
CRTL + R | 在历史命令中搜索 |
CRTL + C | 强制终止当前的命令 |
CRTL + D | 退出当前的终端 |
CRTL + A | 把光标移动到命令行的开头 |
CRTL + E | 把光标移动到命令行的结尾 |
CRTL + Z | 暂停,并放入后台 |
CRTL + S | 暂停屏幕输出 |
CRTL + Q | 恢复屏幕输出 |
3.3 输入输出重定向
输出重定向
- 标准输出重定向
- 命令 > 文件 以覆盖的方式,把命令输出到指定的文件中
- 命令 >> 文件 以追加的方式,把命令输出到指定的文件中
- 标准错误输出重定向
- 错误命令 2> 文件 以覆盖的方式,把命令的错误输出到指定的文件中
- 错误命令 2>> 文件 以追加的方式,把命令的错误输出到指定的文件中
- 正确输出和错误输出同时保存
- 命令 > 文件 2>&1
- 命令 >> 文件 2>&1
- 命令 &> 文件
- 命令 &>> 文件
- 命令 >> 文件1 2>> 文件2 把正确的输出追加到文件1,错误的输出追加到文件2
注意:ls &> /dev/null
其实是把输出丢到垃圾箱中。
输入重定向
给源码包打补丁的时候用到。
# wc //统计输入的字节数,单词数,行数。CRTL+D 结束。
# wc < file //统计file文件的字节数,单词数,行数。
# wc << //把两个符号之间的内容作为输入。
wc
[选项] [文件名]
-c
统计字节数-w
统计单词数-l
统计行数
3.4 多命令顺序执行与管道符
多命令顺序执行
符号 | 格式 | 作用 |
---|---|---|
; | 命令1 ; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令1 && 命令2 | 逻辑与:当命令1正确执行,命令2才会执行 |
|| | 命令1 || 命令2 | 逻辑或:当命令1执行不正确,命令2才会执行 |
判断一条命令是否正确执行:命令 && echo yes || echo no
| 管道符
命令1 | 命令2
命令1的正确输出作为命令2的操作对象。
# ll -a /etc/ | more
grep 命令
-i
忽略大小写-n
输出行号-v
反向查找
# grep "root" /etc/passwd
# grep -n "root" --color=auto /etc/passwd
# netstat -an|grep ESTABLISHED
3.5 通配符和其他特殊符号
通配符
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个字符 |
[] | 匹配中括号中任意一个字符,例如:[abc]代表一定匹配一个字符,或是a,或是b,或是c。 |
[-] | 匹配中括号中任意一个字符,- 代表一个范围。例如:[a-z],代表匹配一个小写字母。 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符。例如: 【^0-9】代表匹配不是一个数字的字符。 |
Bash中其他特殊符号
符号 | 作用 |
---|---|
'' | 单引号。在单引号中所有的特殊符号,如 “$” 和 “`” 都没有特殊含义。 |
"" | 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、"`"、“\” 是例外。拥有“调用变量的值”、“引用命令”、“转义符号”的特殊含义。 |
`` | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样。 |
$() | 和反引号作用一样,用来引用系统命令。 |
# | 在 Shell 脚本中,#开头的行代表注释。 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。 |
\ | 转义符,跟在 \ 之后的特殊符号失去特殊含义,变为普通字符。 |
注意:
# name = sc
# echo $name
sc
# echo '$name'
$name
# echo "$name"
sc
4. Bash 变量
4.1 用户自定义变量
用户自定义变量只在当前的 Shell 中生效。又称作:本地变量。
-
本地变量
# aa=123 # echo $aa 123 # aa="$aa"456 # echo $aa 123456 # aa=${aa}789 # echo $aa 123456789
-
变量调用
# echo $name
-
变量查看
# set //查看系统中所有的变量
-
变量删除
# unset name
注意:空格处理
需要用单引号或双引号包起来。
# name = "hello kiti"
# echo $name
hello kiti
4.2 环境变量
环境变量可以在当前和所有的 Shell 与子 Shell 中生效。
系统环境变量,名称不能变。可以修改值。
还可以有一部分自定义的环境变量。
设置环境变量
- export [变量名]=[变量值] #声明变量
- env #查询当前系统环境变量
- unset [变量名] #删除变量
注意: pstree
确定进程数。
系统常见环境变量
-
PATH
#系统查找命令的路径-
冒号分割
-
变量叠加
PATH="$PATH":/root/sh #临时有效
-
-
PS1
#定义系统提示符的变量,env 命令看不到系统提示符 说明 \d
显示日期,格式为“星期 月 日” \h
显示简写主机名。如默认主机名“localhost” \t
显示24小时制的时间,格式为“HH:MM:SS” \T
显示12小时制的时间,格式为“HH:MM:SS” \A
显示24小时制的时间,格式为“HH:MM” \u
显示当前用户名 \w
显示当前所在目录的完整名称 \W
显示当前所在目录的最后一个目录 \#
执行的第几个命令 \$
提示符,root用户为“#”,普通用户为“$” 例如: # PS1='[\u@\t \w]\$' # PS1='[\u@\h \W]\$'
4.3 位置参数变量
名称固定,作用不可变。
位置参数变量 | 作用 |
---|---|
$n | n为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 ${10}。 |
$* | 这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,$@ 把所有的参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
案例:
#!/bin/bash
for i in "$*"
do
echo $i
done
for y in "$@"
do
echo $y
done
输出:
1 2 3 4
1
2
3
4
案例2:
#!/bin/bash
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
输出:
# ./ddd.sh a b c
number:3
scname:./ddd.sh
first :a
second:b
argume:a b c
4.4 预定义变量
预定义变量
预定义变量 | 作用 |
---|---|
$? | 最后一次执行的命令返回状态。如果变量值为0,则说明上一个命令正确执行。 如果不为0,则说明上个命令执行错误。 |
$$ | 当前进程的进程号 |
$! | 后台运行的最后一个进程的进程号 |
案例:
#!/bin/bash
# Author:kiti (E-mail:kiti@163.com)
#输出当前的进程PID
echo "The current process is $$"
#使用 find 在 root 目录下查找 hello.sh文件
#符号 & 的意思是把命令放到后台执行
find /root -name hello.sh &
echo "The last one Daemon process is $!"
接收键盘输入
read
[选项] [变量名]
-p
“提示信息”-t
秒数-n
字符数-s
隐藏输入的数据,适用于密码等机密信息的输入
案例:
#!/bin/bash
# Author:kiti (E-mail:kiti@163.com)
read -t 30 -p "Please input your name:" name
echo "Name is $name"
read -s -t 30 -p "Please enter your age:" age
echo -e "\n"
echo "Age is $age"
read -n 1 -t 30 -p "Please select your gender[M/F]:" gender
echo -e "\n" #-e:激活转义字符
echo "Sex is $gender"
5. Bash 运算符
Linux中变量默认都是字符串类型。
5.1 数值运算与运算符
declare 声明变量类型
declare
[+/-]
[选项] 变量名
-
# 给变量设定类型属性+
# 取消变量的类型属性-i
#将变量声明为整数型(integer)-x
#将变量声明为环境变量-p
#显示指定变量被声明的类型
数值运算-方法1:declare
# aa=11
# bb=22
# cc=$aa+$bb
# echo $cc
11+22
# declare -i cc =$aa+$bb
# echo $cc
33
数值运算-方法2:expr或let数值运算工具
# aa=11
# bb=22
# dd=$(expr $aa + $bb) //注意:“+” 左右两侧必须有空格
数值运算-方法3:"$((运算式))
" 或 “$[运算式]
”
# aa=11
# bb=22
# ff=$(($aa+$bb))
# gg=$[$aa+$bb]
运算符
优先级 | 运算符 | 说明 |
---|---|---|
13 | -,+ | 单目负,单目正 |
12 | !,~ | 逻辑非、按位取反或补码 |
11 | *,/,% | 乘、除、取模 |
10 | +,- | 加、减 |
9 | <<,>> | 按位左移、按位右移 |
8 | <=,>=,<,> | 小于或等于,大于或等于、小于、大于 |
7 | ==,!= | 等于、不等于 |
6 | & | 按位与 |
5 | ^ | 按位异或 |
4 | | | 按位或 |
3 | && | 逻辑与 |
2 | || | 逻辑或 |
1 | =,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= | 赋值、运算且赋值 |
案例:
# aa=$((11+3)*3/2)
# bb=$((14%3))
# cc=$((1&&0))
运算结果:aa=21,bb=2,cc=0
5.2 变量测试与内容替换
变量置换方式 | 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 |
案例:
# y=""
# x=${y-new}
# echo $x
6. 环境变量配置文件
要想配置参数永久生效,必须写在配置文件中。
source
命令:
-
source [配置文件]
#让文件直接生效,不需重启 -
. [配置文件]
#.
后加空格等于source
命令
6.1 环境变量配置文件简介
环境变量配置文件主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME 等默认环境变量。
5类配置文件:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
~/.bash_profile
~/.bashrc
注意:
- 在
/etc/
目录下的配置文件对所有登录用户都是有效的 - ”
/
“ 是根目录,”~
“ 是家目录。比如root用户的”家“目录就是/root,普通用户a的家目录就是/home/a 。 - 带 “
.
” 表示是隐藏文件类型。
6.2 环境变量配置文件作用
配置文件有序调用
同一个变量后面的文件会覆盖前面的文件。
第一棵树
/etc/profile
/etc/profile.d/*.sh
- 各种sh脚本文件
/etc/profile.d/lang.sh
- 定义系统语言
/etc/sysconfig/i18n
- 系统默认的语言环境
第二棵树
/etc/profile
~/.bash_profile
- 调用了 ~/.bashrc 文件
- 追加了用户家目录
PATH=$PATH:$HOME/bin
~/.bashrc
- 定义了默认别名 alias
- 调用 /etc/bashrc
/etc/bashrc
- PS1
- umask
- PATH
- 调用
/etc/profile.d/*.sh
文件
- 命令提示符
/etc/profile 的作用
- USER 变量
- LOGNAME 变量
- MAIL 变量
- PATH 变量
- HOSTNAME 变量
- HISTSIZE 变量
- umask 设置了用户创建文件的默认权限
- 调用 /etc/profile.d/*.sh
6.3 其他配置文件和登录信息
注销时生效的环境变量配置文件
~/.bash_logout
- 注销时执行
其他配置文件
~/bash_history
- 保存所有的历史命令
Shell 登录信息
本地登录欢迎信息:/etc/issue
转义符 | 作用 |
---|---|
\d | 显示当前系统日期 |
\s | 显示当前操作系统名称 |
\l | 显示登录的终端号,比较常用 |
\m | 显示硬件的体系结构,如i386,i686 |
\n | 显示主机名 |
\o | 显示域名 |
\r | 显示内核版本 |
\t | 显示当前系统时间 |
\u | 显示当前登录用户的序列号 |
远程终端欢迎信息:/etc/issue.net
- 转义符在
/etc/issue.net
文件中不能使用 - 是否显示此欢迎信息,由ssh的配置文件
/etc/ssh/sshd_config
决定,加入“Banner/etc/issue.net
”行才能显示(记得重启sshd服务)
登陆后欢迎信息:/etc/motd
不管你是本地登录还是远程登录,都可以显示此欢迎信息。