shell_basic

1、回顾基础命令
2、脚本
3、变量
4、别名
5、条件判断
6、test判断
 
一、回顾基础命令
shutdown --关机/重启
exit --退出当前shell
rmdir --删除空目录
du --查看目录占用的存储空间
df --查看已 经挂载的文件系统的空间使用情况
ln --创建链接
cat --显示文件的所有内容
head --显示文件的头部
tail --显示文件的尾部
less --分屏/分页 显示文件内容
dirname --取出目录
basename --取出文件名
history --历史命令
1、ln
# ln -s [目标] [源 -- 创建软链接 (symbolic link)
# ln [目标] [源] -- 创建硬链接
2、cat
concatinate,把文件的内容按顺序连接起来,输出到标準输出。目前,只需要简单理解成显示文件的内容即可
# cat f1 -- 显示文件 f1 的内容到屏幕上
# cat -n f1 -- 显示文件的内容,并且加上行号
# cat -A f1 -- 打印出一些不可见的字符和位置标记
3、head
读取文件的头部
# head -n 3 /etc/passwd --读取文件前面三行
# head -n -3 /etc/passwd --读取文件时,丢掉文件的后三行;
# head -c 3 /etc/passwd --读取文件的前面三个字节
# head -c 10m /dev/zero > f1 --创建一个10M的文件
4、tail
读取文件的尾部
# tail -n 3 /etc/passwd -- 读取文件的后面三行
# tail -c 3 /etc/passwd -- 读取文件的后面三个字节
# tail -n +28 /etc/passwd -- 读取文件中从第28行开始直到结尾的所有行
# tail -f /etc/passwd -- 跟踪文件尾部内容的变化,常用观察日志文件的变化
5、history
# set -o history --启用命令历史功能 ,默认记录在文件 ~/.bash_history 中
# set +o history --关闭命令历史功能
# history --显示最近n条历史命令
注:以下三个变量用于控制命令历史的数量,以及是否记录时间戳
# vim /etc/bashrc --一般配置在该文件当中,用户级可配置在 ~/.bashrc
HISTSIZE=1000000 --最多存储多少条记录
HISTFILESIZE=2000000 --命令历史文件的最大尺寸
HISTTIMEFORMAT='[%Y-%m-%d %H:%M:%S] ' --命令历史的时间戳格式
export HISTSIZE HISTFILESIZE HISTTIMEFORMAT --把他们定义成环境变量
 
二、脚本
1、如何执行脚本
   # vim test.sh
    #!/bin/bash
  echo 'hello world'
# bash test.sh
# bash -x test.sh --显示脚本执行过程的信息
# sh test.sh
# source test.sh
# . test.sh
--上述兼为非标准执行脚本,脚本文件可以没有可执行权限;下列为标准执行:
# head -n 1 test.sh
#!/bin/bash
# chmod a+x test.sh
# ./test.sh
可直接将脚本放到 PATH 路径下,直接当命令运行
注意:shell 必须以 #! 开头,读作sha-bang,这两个字符用来标识文件类型,#! 用来告诉系统,这个文件里的内容将要用指定的解释器来解释,#! 之后的字符串将会被解释成一个程序,该程序用来解释当前文件。如果没有提供sha-bang这一行,当前 shell 将会自主猜测一个,但结果并不保证和预期一致;所以最好明确指定。./test.sh 的运行流程:
1、内核读取该脚本,检查文件类型标记,获取解释气得路径;
2、内核运行解释器;
3、解释器运行起来后,就打开脚本文件,解释其执行
linux 自带的诸多解释器:#!/bin/bash;#!/bin/sh;#!/usr/bin/perl;#!/bin/sed;#!/bin/awk
2、四则运算符
+ - * /
$(()) $[] expr let
# echo $((38%5)) --取余
# echo $[38/5] --求商
# echo $((10**2)) --10的平方
2.1、expr
# expr 14 % 9 --取余
# expr 34 / 9 --求商
# expr 30 \* 3 --使用乘号时,必须用反斜线屏蔽其特定含义
# expr index "sarasara" a --抓取第一个字符数字串出现的位置
# expr substr "this is a test" 3 5 --抓取字串
# expr length "this is a test" --计算字串长度
2.2、let
let计算工具用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来
# no=20
# let no++ --自增
# let no-- --自减
# let no+=10 --自增10
# let no=no+10 --同上
# let no-=15 --自减15
# let a=5+4 --变了a无须加 $ 符号
# echo $a
3、shell配置文件
/etc/profile --全局配置文件,
/etc/bashrc --全局配置文件,一般用来定义环境变了
~/.bash_profile --用户配置文件
~/.bashrc --用户配置文件
~/.bash_logout --用户配置文件,login shell 退出时会读取该文件
4、shell种类
根据shell 的启动方式不同,可以大致地把shell分为以下几种:
login shell --在文本界面登录,如su -;读取shell配置文件顺序如下:
/etc/profile——~/.bash_profile——~/.bashrc——/etc/bashrc
interactive shell --gnome-terminal 中默认的shell;读取shell配置文件顺序如下:
~/.bashrc —— /etc/bashrc
non-interactive shell --用来运行脚本的shell
 
4.1、在~/.bashrc 中设置一个变量 v,要求该变量只出现在交互shell中
# vim ~/.bash_profile --标识shell 是否登录shell
LOGINSHELL=1
# vim ~/.bashrc --不是登录shell 时,才设置变量
if [ "$LOGINSHELL" != 1 ];then
v="interactive shell only"
fi
5、命令优先级
别名 > 函数 > 内部命令 > 外部命令
6、shell特殊字符
对于shell来说,有些字符除了它本身的意义之外,还有特殊的意义,如果要在字符串中包含特殊字符,就必须通过引用(quoting)的方法来去除特殊字符的特殊意义。以下列出的是部分特殊字符:
~ --不被引用的话将会被shell 替换成家目录
& --把程序放到后台执行
$ --dollar 符,可用于参数展开
${} --变量处理,可对变量的内容做替换,删除,抽取等操作
* --星号,通配符,匹配所有字符
? --问号,通配符,匹配任意一个字符
() --命令组
{} --命令组
"" --双引号,引用符号;可以去除大多数特殊字符的特殊意义,除 $;`;!;\ 外
'' --单引号,引用符号;可以去除所有特殊字符的特殊意义,除自己本身
. --相当于source命令;可用于设置隐藏文件;用于目录名时,代表当前目录
/ --斜杠,路径分隔符,根目录
\ --反斜杠,可用来去除单个字符的特殊意义,也就是所谓的“转义“,也可用于表示特殊字符,如换行符 (\n)
`` --反撇号,命令优先执行,和$()含义是一样的;如果有嵌套那么不能用``号
$(())和 $[] --运算符
: --空命令
; --命令分割;不去考虑上一条命令所执行的结果
;; --case 选项的结束符
# --注释
&& --逻辑与;可对命令进行分割;但是需要考虑上一条命令所执行的结果
|| --逻辑或;可对命令进行分割;不需要考虑上一条命令执行结果
----------------------------------------------------------------
# echo 'hello world;' "hello world;" hello\ world; --用三种引用符合去除空格的特殊意义
 
三、变量
1、本地变量
当前用户自定义的变量;当前进程有效,其他进程或者当前进程的子进程无效
# a=123
# echo $a
# unset a --取消变了定义
2、环境变量
当前进程有效,并且能被子进程调用;
# env --查看当前系统所有环境变量
# set --查看当前系统所有环境变量和临时变量
# echo $PATH -- 显示PATH变量的内容
# export hi=hello --定义环境变量;工作当中一般喜欢把即用的环境变了写在 ~/.bash_profile
几个常见环境变量:
PATH --影响命令的搜索
PS1 --命令提示符
TMOUT --超时时间,单位为S,时间一到,自动退出 interactive shell ;所以最好将其设为只读变量 # declare -r TMOUT=60
HISTSIZE, HISTFILESIZE, HISTTIMEFORMAT --命令历史
 
3、系统变量
又叫bash中内置的变量;shell本身已经固定好的一些变量
$# --脚本后面接参数个数
$* --脚本后面所有的参数(被双引号包含则被当成一个字符串输出)
$@ --脚本后面所有的参数(被双引号包含还是保留各参数的边界)
$? --上一条命令执行后返回的状态
$$ --当前进程的进程号
$! --后台运行的最后一个进程号
!$ --最后一条命令或参数
!! --最后一条命令的历史记录
$0 --当前程序的程序名或进程
$1~$n --位置参数变量
#!/bin/bash
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$1 = $2"
echo "\$7 = $7"
echo "\$11 = ${11}"
# chmod a+x test.sh
# ./test.sh a b c
4、变量定义
a、默认下,变量类型没啥要求。可以给变量赋任何值,但是等号两边不能有任何的空格
b、变量名区分大小写
c、变量名不能以数字或者特殊符号开头
d、将命令所执行的结果保存到变量
5、调用变量
# a=$(hostname)
# A=123456789
# echo $A
# echo ${A:2:3}
6、数组
数组的定义:用小括号扩起来定义数组,括号里的元素用空格隔开
# array[0]=var1
# array[1]=var2
# array[2]=var3
# array=(var1 var2 var3) --等同于上述三行,定义数组
# echo ${array[0]} --取数组第一个值
# echo ${array[*]} --取数组所有值
# echo ${array[@]} --同上
7、declare 定义有类型的变量
-i --将变量看成整数
-r --定义只读变量
-x --将变量导出到环境变量
-a --将变量看成数组
8、read 交互式定义变量
-p --提示信息
-n --字符数
-t --超时
-s --不显示
 
四、別名
命令的別名,顾名思义,就是可以通过別的名字来执行命令。通常用于简化命令的输入,或者为命令增加一些参数,或者是单纯地为命令添加多个访问名称。
# alias cp mv rm --查看cp, mv, rm这三个命令是不是別名
# unalias rm -- 删除别名 rm
# alias cdyum='cd /data/yum' -- 简化输入
# alias rm='rm -i' -- 为命令增加参数
-- 通常別名是在配置文件~/.bashrc 中设置的
1、验证别名、函数、内部命令、外部命令的优先级别
# alias pwd='echo it is an alias' --创建一个 pwd 别名
# function pwd() { echo "this is a function"; } --创建一个 pwd 函数
# pwd --运行pwd,发现输出是别名
# unalias pwd --删除别名,再运行 pwd,发现输出是函数内容
# unset pwd --删除函数,再运行 pwd,才是输出当前所在路径
所以:别名 > 函数 > 内部命令 > 外部命令
 
五、条件判断
# vim test
----------------------
if [ 条件 ];then
command...
fi
----------------------
if [ 条件 ];then
command...
else
command...
fi
----------------------
if [ 条件1 ];then
command1...
elif [ 条件2 ];then
command2...
else
command3...
fi
----------------------
if [ 条件1 ];then
command1...
if [ 条件2 ];then
command2...
fi
else
if [ 条件3 ];then
command3...
elif [ 条件4 ];then
command4...
else
command5...
fi
fi
 
六、test判断
test == [ judge ]
1、文件存在与否的判断
# vim test.sh
#!/bin/bash
if test -e $1;then --是否存在;还有 -p;-c;-b;-L
if [ -f $1 ];then --使用 [ judge ] 替换
if test -f $1;then --是否存在并且为普通文件
if test -d $1;then --是否存在并且为目录
if test -S $1;then --是否存在并且套接字文件
echo 'YES'
fi
# chmod a+x test.sh
# ./test.sh [path]
2、文件权限相关判断
-r;-w;-x --是否有读,写,执行权限
-u --是否有suid
-g --是否有sgid
-k --是否有t位
-s --是否为空白文件,-s表示非空;! -s 空文件
3、字符串判断
= --等于则为真,等于号两边必须有空格;也可以是:==
!= --不相等则为真
-z 字符串 --字符串的长度为零则为真
-n 字符串 --字符串的长度不为零则为真
if test $num1 = $num2;then
if [ $num1 = $num2 ];then
if [ -n $num1 ];then
4、数值判断
-eq --等于则为真
-ne --不等于则为真
-gt --大于则为真
-ge --大于等于则为真
-lt --小于则为真
-le --小于等于则为真
if test $[num1] -eq $[num2];then
if [ $[num1] -eq $[num2] ];then
5、逻辑判断
-a 和 && --逻辑与
-o 和 || --逻辑或
! --非
优先级:与>或>非
if test -e $1 -o -e $2;then --判断是否有一个文件存在
if [ -e $1 -o -e $2 ];then --同上
if test ! -e $1 -o ! -e $2;then --判断两个文件没有同时存在
if [ ! -e $1 -o ! -e $2 ];then --同上
 
posted @ 2017-06-26 16:17  一个小运维  阅读(987)  评论(1编辑  收藏  举报