- 第十章 Shell基础
- PATH变量叠加
- !/bin/bash for i in “$“ #$中的所有参数看成是一个整体,所以这个for循环只会循环一次 do echo “The parameters is: $i” done x=1 for y in “$@” #$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 do echo “The parameter$x is: $y” x=$(( $x +1 )) done
- /bin/bash # Author: shenchao (E-mail: shenchao@lampbrother.net) echo “The current process is $$” #输出当前进程的PID。 #这个PID就是variable.sh这个脚本执行时,生成的进程的PID find /root -name hello.sh & #使用find命令在root目录下查找hello.sh文件 #符号&的意思是把命令放入后台执行,工作管理我们在系统管理章节会详细介绍 echo “The last one Daemon process is $!”
- !/bin/bash #Author: shenchao (E-mail: shenchao@lampbrother.net) read -t 30 -p “Please input your name: “ name #提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中 echo “Name is $name “ read -s -t 30 -p “Please enter your age: “ age #年龄是隐私,所以我们用“-s”选项隐藏输入 echo -e “\n” echo “Age is $age “ read -n 1 -t 30 -p “Please select your gender[M/F]: “ gender #使用“-n 1”选项只接收一个输入字符就会执行(都不用输入回车) echo -e “\n” echo “Sex is $gender”
第十章 Shell基础
10.1 Shell概述
- Shell是什么
- Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
- Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
- Shell的分类
- Bourne Shell:从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。
- C Shell: C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名
- Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh
- Bash: Bash与sh兼容,现在使用的Linux 就是使用Bash作为用户的基本Shell。
目前学的主要就是bash
- Linux支持的Shell
- echo输出命令
[root@localhost ~]# echo [选项] [输出内容]
选项: -e: 支持反斜线控制的字符转换
[root@localhost ~]# echo -e “ab\bc”
#删除左侧字符
[root@localhost ~]# echo -e “a\tb\tc\nd\te\tf”
#制表符与换行符
[root@localhost ~]# echo -e “\x61\t\x62\t\x63\n\x64\t\x65\t\x66”
#按照十六进制ASCII码也同样可以输出
[root@localhost ~]# echo -e “\e[1;31m abcd \e[0m”
#输出颜色
#30m=黑色,31m=红色,32m=绿色,33m=黄色
#34m=蓝色,35m=洋红,36m=青色,37m=白色
- 第一个脚本
[root@localhost sh]# vi hello.sh #!/bin/Bash
#The first program # Author: shenchao (E-mail: shenchao@lampbrother.net)
echo -e “Mr. Shen Chao is the most honest man in LampBrother”
- 脚本执行
- 方法一:赋予执行权限,直接运行
- chmod 755 hello.sh
- ./hello.sh —-用路径来执行
- 方法二:通过Bash调用执行脚本
- bash hello.sh
- sh hello.sh
- 小案例
tips:俄罗斯方块游戏代码点击下载
密码:du55
脚本在window执行成功的,回车符是M$,需要通过dos2unxi转换为linux格式
yum install -y dos2unix
cat -A game.sh
chmod 755 game.sh
./game.sh
10.3 Bash的基本功能
10.3.1 历史命令与命令补全
- 历史命令
[root@localhost ~]# history [选项] [历史命令保存文件]
选项:
-c: 清空历史命令
-w: 把缓存中的历史命令直接写入历史命令保存文件
~/.bash_history
- 历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
历史命令的调用
- 使用上、下箭头调用以前的历史命令
- 使用“!n”重复执行第n条历史命令
- 使用“!!”重复执行上一条命令
- 使用“!字串”重复执行最后一条以该字串开头的命令
- 命令与文件补全
- 命令别名
[root@localhost ~]# alias 别名=’原命令’
#设定命令别名
[root@localhost ~]# alias
#查询命令别名
命令执行时顺序
1 第一顺位执行用绝对路径或相对路径执行的命令。
2 第二顺位执行别名。
3 第三顺位执行Bash的内部命令。
4 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
(linux每条指令都需要用绝对路径,只是某些命令有$PATH)
让别名永久生效
[root@localhost ~]# vi /root/.bashrc
删除别名
[root@localhost ~]# unalias 别名
- Bash常用快捷键
10.3.3 输入输出重定向
- 标准输入输出
- 输出重定向
- 最下面两种较常用
- 输入重定向
[root@localhost ~]# wc [选项] [文件名]
选项:
- c 统计字节数
- w 统计单词数
- l 统计行数
- 命令<文件 把文件作为命令的输入
- 命令<< 标识符
…
标识符 把标识符之间内容作为命令的输入
(一般用在源码补丁)
10.3.4 多命令顺序执行与管道符
- 多命令顺序执行
例子: [root@localhost ~]# ls ; date ; cd /user ; pwd
[root@localhost ~]# dd if=输入文件 of=输出文件 bs=字节数 count=个数
选项:
if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数 指定输入/输出多少个数据块
例子:
[root@localhost ~]# date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
[root@localhost ~]# ls anaconda-ks.cfg && echo yes
[root@localhost ~]# ls /root/test || echo “no
[root@localhost ~]# 命令 && echo yes || echo no
- 管道符
命令格式:
[root@localhost ~]# 命令1 | 命令2
#命令1的正确输出作为命令2的操作对象
颜色显示
例子:
[root@localhost ~]# ll -a /etc/ | more
[root@localhost ~]# netstat -an | grep “ESTABLISHED”
[root@localhost ~]# grep [选项] “搜索内容” 文件名
选项:
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
—color=auto 搜索出的关键字用颜色显示
10.3.5 通配符与其他特殊符号
1、通配符
[root@localhost ~]# cd /tmp/ [root@localhost tmp]# rm -rf [root@localhost tmp]# touch abc [root@localhost tmp]# touch abcd [root@localhost tmp]# touch 012 [root@localhost tmp]# touch 0abc [root@localhost tmp]# ls ?abc [root@localhost tmp]# ls [0-9] [root@localhost tmp]# ls [^0-9]*
- Bash中其他特殊符号
反引号与$()
[root@localhost ~]# echo ls
[root@localhost ~]# echo $(date)
单引号与双引号
[root@localhost ~]# name=sc
[root@localhost ~]# echo ‘$name’
[root@localhost ~]# echo “$name”
[root@localhost ~]# echo ‘$(date)’
[root@localhost ~]# echo “$(date)”
10.4 Bash的变量
10.4.1 用户自定义变量
- 什么是变量
- 变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
- 变量设置规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。
- 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
- 变量用等号连接值,等号左右两侧不能有空格。
- 变量的值如果有空格,需要使用单引号或双引号包括。
- 在变量的值中,可以使用“\”转义符。
- 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
- 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
- 环境变量名建议大写,便于区分。
- 变量分类
- 用户自定义变量 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
4、本地变量
- 变量定义
[root@localhost ~]# name=”shen chao”
- 变量叠加
[root@localhost ~]# aa=123
[root@localhost ~]# aa=”$aa”456
[root@localhost ~]# aa=${aa}789
- 变量调用
[root@localhost ~]# echo $name
- 变量查看
[root@localhost ~]# set
查看当前系统全部变量
- 变量删除
[root@localhost ~]# unset name
10.4.2 环境变量
- 环境变量是什么
- 用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效
tips:pstree是以树结构显示进程(–display a tree of processes)
提示:-bash: pstree: 未找到命令,那么root身份执行 yum install psmisc
- 设置环境变量
export 变量名=变量值
#申明变量
env
#查询变量
unset 变量名
#删除变量
- 系统常见环境变量
- PATH:系统查找命令的路径
[root@localhost ~]# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin: /sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- PATH=”$PATH”:/root/sh
PATH变量叠加
- PS1:定义系统提示符的变量
\d:显示日期,格式为“星期 月 日”
\h:显示简写主机名。如默认主机名“localhost”
\t:显示24小时制时间,格式为“HH:MM:SS”
\T:显示12小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
#:执行的第几个命令
\$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”
举例:
- [root@localhost ~]# PS1=’[\u@\t \w]\$ ‘
- [root@04:50:08 /usr/local/src]#PS1=’[\u@\@ \h # \W]\$‘
- [root@04:53 上午 localhost 31 src]#PS1=’[\u@\h \W]\$ ‘
[显示当前用户名 显示当前用户名 显示当前所在目录的最后一个目录] 提示符
10.4.3 位置参数变量
- 位置参数变量
例子1:
#!/bin/bash
num1=$1
num2=$2
sum=$(( $num1 + $num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值
例子2:
#!/bin/bash
echo “A total of $# parameters”
#使用$#代表所有参数的个数
echo “The parameters is: $“
#使用$代表所有的参数
echo “The parameters is: $@”
#使用$@也代表所有参数
例子3:$*与$@的区别
!/bin/bash for i in “$“ #$中的所有参数看成是一个整体,所以这个for循环只会循环一次 do echo “The parameters is: $i” done x=1 for y in “$@” #$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 do echo “The parameter$x is: $y” x=$(( $x +1 )) done
10.4.4 预定义变量
- 预定义变量
/bin/bash # Author: shenchao (E-mail: shenchao@lampbrother.net) echo “The current process is $$” #输出当前进程的PID。 #这个PID就是variable.sh这个脚本执行时,生成的进程的PID find /root -name hello.sh & #使用find命令在root目录下查找hello.sh文件 #符号&的意思是把命令放入后台执行,工作管理我们在系统管理章节会详细介绍 echo “The last one Daemon process is $!”
- 接收键盘输入
[root@localhost ~]# read [选项] [变量名]
选项:
-p “提示信息”:在等待read输入时,输出提示信息
-t 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会 执行
-s: 隐藏输入的数据,适用于机密信息的输入
!/bin/bash #Author: shenchao (E-mail: shenchao@lampbrother.net) read -t 30 -p “Please input your name: “ name #提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中 echo “Name is $name “ read -s -t 30 -p “Please enter your age: “ age #年龄是隐私,所以我们用“-s”选项隐藏输入 echo -e “\n” echo “Age is $age “ read -n 1 -t 30 -p “Please select your gender[M/F]: “ gender #使用“-n 1”选项只接收一个输入字符就会执行(都不用输入回车) echo -e “\n” echo “Sex is $gender”
10.5 Bash的运算符
10.5.1 数值运算与运算符
- declare声明变量类型
[root@localhost ~]# declare [+/-][选项] 变量名
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(integer)
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
- 数值运算
方法1 :
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22 #给变量aa和bb赋值
[root@localhost ~]# declare -i cc=$aa+$bb
方法2:expr或let数值运算工具
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和变量bb赋值
[root@localhost ~]# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和。注意“+”号左右两侧必须有空格
方法3:“$((运算式))”或“$[运算式]”(推荐)
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(( $aa+$bb ))
[root@localhost ~]# gg=$[ $aa+$bb ]
- 运算符
[root@localhost ~]$ aa=$(( (11+3)*3/2 )) #虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级 [root@localhost ~]$ bb=$(( 14%3 )) #14不能被3整除,余数是2 [root@localhost ~]$ cc=$(( 1 && 0 )) #逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0
10.5.2 变量测试与内容替换
例子1:测试x = $ { y - 新值}
[root@localhost ~]# unset y #删除变量y [root@localhost ~]# x=${y-new} #进行测试 [root@localhost ~]# echo $x new #因为变量y不存在,所以x=new [root@localhost ~]# y=”” #给变量y赋值为空 [root@localhost ~]# x=${y-new} #进行测试 [root@localhost ~]# echo $x [root@localhost ~]# y=old #给变量y赋值 [root@localhost ~]# x=${y-new} #进行测试 [root@localhost ~]# echo $x old
10.6 环境变量配置文件
10.6.1 环境变量配置文件简介
- source命令
[root@localhost ~]# source 配置文件
或
[root@localhost ~]# . 配置文件
- 环境变量配置文件简介
- 环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。
- /etc/profile
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
-
10.6.2 环境变量配置文件作用
/etc/profile
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
tips:/etc 目录下的对所有用户都生效
~/.bash_profile 和 ~/.bashrc -> 每个用户自己的配置文件,只对用户生效。
下图为配置文件读取顺序:
上图从左到右如果没有叠加。后面的命令会覆盖前面的命令。
/etc/profile的作用:
- USER变量:
- LOGNAME变量:
- MAIL变量:
- PATH变量:
- HOSTNAME变量:
- HISTSIZE变量:
- umask:
- 调用/etc/profile.d/*.sh文件
~/.bash_profile的作用
- 注销时生效的环境变量配置文件
- ~/.bash_logout
- 其他配置文件
- ~/bash_history
- Shell登录信息
- 本地终端欢迎信息: /etc/issue
- 远程终端欢迎信息: /etc/issue.net
- 转义符在/etc/issue.net文件中不能使用
- 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务)
- 登陆后欢迎信息:/etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息