Shell 基础知识
1.简介
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它接收用户命令,然后调用相应的应用程序。(百度百科)
kernel主要的四种功能
内存管理
软件程序管理
硬件管理
文件系统
知识点小节:
#!/bin/bash 脚本文件的第一行是个特例
# 注释行,不执行
执行:sh
显示脚本debug: sh -x vim/set -x 重复debug模式
不执行只检测语法: sh -n
bash
./
~~~~~~~~~~~~~~~
注释信息
#!/bin/bash
# Description:
# Date: 2016-9-26 16:50:10
# Email: [email protected]
# Author: Mag
# Version: 0.01
~~~~~~~~~~~~~~~
脚本加密工具shc
shc -r -f filename
2.Shell环境变量
变量类型:
字符型
数值型:
bash中的变量的种类:【根据变量的生效范围等标准】
本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;【也包括当前shell的父shell】
环境变量:生效范围为当前shell进程及其子进程;
局部变量:生效范围为当前shell进程中某代码片断(通常指函数);
位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数;
特殊变量:$?, $0, $*, $@, $#
###
本地变量:
变量赋值:name='value'
(1) 可以是直接字串; name="username"
(2) 变量引用:name="$username"
(3) 命令引用:name=`COMMAND`, name=$(COMMAND)
变量引用:${name}, $name
"":弱引用,其中的变量引用会被替换为变量值;
'':强引用,其中的变量引用不会被替换为变量值,而保持原字符串;
显示已定义的所有变量:
set
销毁变量:
unset name
环境变量:
变量声明、赋值:
export name=VALUE
declare -x name=VALUE
变量引用:$name, ${name}
显示所有环境变量:
export
env
printenv
销毁变量:
unset name
bash有许多内建的环境变量:PATH, SHELL, UID, HISTSIZE, HOME, PWD, OLD, HISTFILE, PS1
只读变量:
readonly name
declare -r name
位置变量:
在脚本代码中调用通过命令行传递给脚本的参数;
$1, $2, ...:对应调用第1、第2等参数;
shift [n]
特殊变量:
$0: 脚本名称自身
$?: 上一条命令的执行状态
状态用数字来表示:0-255;
0: 成功
1-255: 失败
$!: 执行上一个后台命令的PID
$#: 这个程序的参数个数(传给脚本的参数个数)
$*: 这个程序的所有参数(传递给脚本的所有参数,视为一个整体,是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个)
$$: 这个程序的PID(脚本运行的当前进程ID号)
$@: 传给脚本的所有参数的列表,每一个参数当作独立的一个字符串
变量的命名要求:
1、不能使程序中的保留字[关键字]:例如if, for
2、只能使用数字、字母和下划线组成,且不能以数字开头
3、见名知义
3.bash的配置文件
profile类:为交互式登录的用户提供配置
/etc/profile: 全局
/etc/profile.d/*.sh: 全局
~/.bash_profile: 个人配置,仅对当前用户有效
功能:
设定环境变量
运行命令或脚本
bashrc类:非交互式登录用户提供配置
/etc/bashrc: 全局
~/.bashrc: 个人配置
功能:
设定本地变量
定义命令别名
通知shell重读配置文件的命令:
source(.)
. FILE
重新登录
交互式登录用户:
/etc/profile --> /etc/profile.d/*.sh -->~/.bash_profile -->~/.bashrc --> /etc/bashrc
非交互式登录用户:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
4.语法
bash中条件判断使用if
单分支:
if 条件; then
分支1;
fi
###示例
if [ -f /tmp/aaa ]
then
echo "yes"
else
echo "no"
fi
双分支:
if 条件;then
分支1;
else
分支2;
fi
多分支:
if 条件1; then
分支1;
elif 条件2;then
分支2
elif 条件3;then
分支3
...
else
分支n;
fi
###示例
if [ $NUM1 -gt $NUM2 ]
then
echo "$NUM1 > $NUM2"
elif [ $NUM1 -lt $NUM2 ]
then
echo "$NUM1 < $NUM2"
else
echo "$NUM1 = $NUM2"
fi
运算语法:
#let var=$s+$i
#var=$(expr $s + $i)
#var=`expr $s + $i`
#var=$[$s+$i]
#var=$(($s+$i))
条件测试方法:
bash: 每个命令,执行状态返回值:
成功: 0
失败: 非0
[[ 测试表达式 ]] 脚本关键字 bash关键字
[ 测试表达式 ] 内生命令 bash命令
test 测试表达式
###示例
test 1 -gt 2; echo $? #是否大于2
test 1 -lt 2; echo $? #是否小于2
test 1 -ge 2; echo $? #是否大于等于2
test 1 -le 2; echo $? #是否小于等于2
test 1 -eq 2; echo $? #是否等2
test 1 -ne 2; echo $? #是否不等于2
组合条件测试: 对条件做逻辑运算
与: 条件1 && 条件2
条件1为假,则最终结果一定为假,因此,条件2将不执行
条件1为真,则最终结果决于后面的条件,因此,条件2必须执行
或: 条件1 || 条件2
条件1为真,则最终结果一定为真,因此,条件2将不再执行
条件1为假,则最终结果决于后面的条件,因此,条件2必须执行
非: !条件
整数测试:
-eq , -ne , -le , -ge, -gt , -lt
字符测试:
双目:
>: 大于
<: 小于
==: 等于,等值比较, 一个”=“ 是做赋值的 【= 其实一个等于号也可以,只要放在测试命令中】
=~: 左则是字符串,右则是一个模式,判定左侧的字符串能否被右侧的模式所匹配,通常只在[[ ]]使用,模式中可以使用行首、行尾锚定符:但模式不要加引号
!=,<>: 不等于
文件测试:
存在性测试
-a FILE
-e FILE: 文件存在性测试,存在为真,否则为假;
存在性及类别测试
-b FILE:是否存在且为块设备文件;
-c FILE:是否存在且为字符设备文件;
-d FILE:是否存在且为目录文件;
-f FILE:是否存在且为普通文件;
-h FILE 或 -L FILE:存在且为符号链接文件;
-p FILE:是否存在且为命名管道文件;
-S FILE:是否存在且为套接字文件;
文件权限测试:
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
文件特殊权限测试:
-g FILE:是否存在且拥有sgid权限;
-u FILE:是否存在且拥有suid权限;
-k FILE:是否存在且拥有sticky权限;
文件大小测试:
-s FILE: 是否存且非空;
文件是否打开:
-t fd: fd表示文件描述符是否已经打开且与某终端相关
-N FILE:文件自动上一次被读取之后是否被修改过;
-O FILE:当前有效用户是否为文件属主;
-G FILE:当前有效用户是否为文件属组;
双目测试:
FILE1 -ef FILE2: FILE1与FILE2是否指向同一个设备上的相同inode
FILE1 -nt FILE2: FILE1是否新于FILE2;
FILE1 -ot FILE2: FILE1是否旧于FILE2;
shell脚本学习方法