linux 系统管理基础
调试shell
sh -x test.sh
sh -v test.sh
在父shell中执行
source
./test.sh
显示shell 层次
登录shell执行文件
/etc/profile
$home/user/.bash_profile
$home/user/.bash_login
$home/user/.profile
按照文件顺序依次执行
新建一个子shell
读取
/etc/bash.bashrc
$home/user/bash.bashrc
sh文件调用顺序
执行login shell
查看/etc/passwd
/bin/sh
读取
/etc/.profile执行
读取
$home/user/.profile 执行
执行交互shell
/bin/sh
产生一个子shell
bash检查ENV,如果有变量 执行变量定义的配置文件
执行shell script
在执行文件存在 #! /bin/sh
bash不会启动任何配置文件
cd
pwd
source
alias cp='cp -i'
unalias cp
umask
history
histfilesize
histsize
fc -l
列出登录shell后执行过度所有命令
type 测试命令
set 设定bash shell 属性
set -o 列出所有的属性
set -o 打开某个属性
set +o 关闭属性
read -a arr << (echo 12 43 33)
echo ${arr[2]}
exec
eval
who
cat
head
tail
wc
ln
mkdir
rmdir
rm
find
find 路径 样式 操作
ex
find / -name '*.txt'
find / -name '*.txt' print
tar cvzf etc.tgz /etc
tar zxvf etc.tgz
解压到指定的目录
tar -zxvf etc.tgz -C test
tar cvf test2 | gzip -9 > save.tgz
gzip -9dc save.tgz | tar xvf -
basename
dirname
sort dataf4 升序排列 按照ascII排序 做大小比较
sort -r dataf4
sort -n dataf4 升序排列,以字符串的数值大小做为比较
sort -k 2 databaf5 字符串方式比较
sort -n +2 跳过第2第3个字段 以字符串的数值大小做为排序依据
unid
uniq dataf3
注意事项:若重复列为连续摆在一起,则不会有任何作用
sort dataf3 | uniq
删除dataf3 文件中的重复行
sort dataf3 | uniq -d
挑选出重复行
sort dataf3 | uniq -c 统计重复行的行数
cut 对文件的每一个行抽出某一部分
cut -c2 dataf1
截取 dataf1 文件中的每一个行的第2个字符
cut -c2-4 文件中的每一个行的第2到个字符
cut -c9- dataf1 文件中的每一个行的第9到最后个字符
cut -c2-3,22- dataf1
cut -d: -f1 /etc/passwd -d选项表示指定分割符
paste 对文件以行和行方式合并
paste dataf1 dataf2
paste -d'#' dataf1 dataf2 合并用#分开
paste -s dataf4 自己合并自己
默认用TAB分开
tr转换或者是删除字符
tr k K < dataf1 把文件中的小K 换成大K
tr ',' '\n'< 把,换成换行
tr -d k 删除晚间中的额K字符
cut -d: f1-6 /etc/passwd | tr:'+'
tr -s '''' <datef1
删除多余的空白只剩下一个
grep A*
grep -i A* 不区分大小写
grep -v La data3 不包含La显示出来
grep -l La* 显示包含La的文件,不显示符合的行
grep -n La*同上,但是现实行号
grep -q keyword filename 含有keyword 则返回0 否则返回非0
tee
tee -a
开启子shell 执行多个命令
(comand1;comand2)
在当前shell执行
{comand1,comand2}
shell ctrl + y 粘贴
ctrl + r 查找历史
Ctrl + n
Ctrl + p
shell
变量只有声明之后才能使用
shopt -s o nounset
declare 声明变量
unset -v 变量名 删除变量值
unset -f 函数名 删除函数
变量和引号
在双引号中可以做如下的操作
替换变量
提花命令执行结果
替换算数运算结果
\$var
在双引号中转义变量
export var 声明环境变量 子shell可以继承共享变量
export -p:列出所有的环境变量
声明环境变量
declare -x var
shell 内置变量
BASH_ENV 在非交互的时候使用.在shell script 执行的时候,首先会检查
$BASH_ENV 是否有指定启动文件,如果有就执行
$BASH_VERSION
$CDPATH
减少输入
ENV 显示环境变量
EUID
FCEDITOR
FIGNORE
FUNCTIONAME
GROUPS
HISTCMD历史命令序号
IPS for i in $var 循环分隔符号定义
ex
#! /bin/bash
PL="root:x:0:0:root:/root:/bin/bash"
IFS=':'
for i in $PL
do
echo $i
done
设置命令行执行多少次crtl+D 之后注销系统
IGNOREEOF=2
INPUTRC
设定命令行函数库readline的启动配置文件,可以覆盖~/.inputrc的设定
PS1 [\h\u@\w]
PS2 >
PS3
PS4
RANDOM
随机数种子
RANDOM=$$ 使用SHELL的进程号作为种子
head -1 /dev/urandom | od -N 2 | head -1 | awk '{print $2 * 1}'
SECONDS shell开启的时间 单位秒
SHELL 文件路径
SHELLOPTS 相当于SET -0 开启的功能
SHLVL 子SHELL层数
TMOUT SHELL超时退出
UID
$0
$1~$n
$@代表所有的参数组成的字符串
$#位置参数的个数
$?上一个命令结束后的传回值
$$$目前bash shell的进程号
$!上一个后台程序的进程编号
$_的用途
(1)script 执行的时候 bash的绝对路径
(2)上一个命令执行时,最后一个位置的参数
(3)检查邮件时候$_的值为邮件名称
变量只读
readonly var
readonly -f function_name
readonly -a array_name
declare -r var_name
declare 用法说明
-P 显示变量的属性
-a 变量是一个数组
-f 搜索命令 只是搜索函数 只是搜索函数列表 不搜索别名或者是外部命令
-i 声明变量为整数类型
-F 显示所有的函数式名称以及属性
-r 设定变量为只读
-t 设立变量具有trace属性
-x 设置变量为环境变量
建立别名
alias
自定义环境
/etc/skel 创建帐号的时候会把此目录中的所有的文件复制一份到用户的家目录中
数组的用法
A[0]=1
A[1]=2
A[3]="chehci"
echo ${A[1]}
echo ${A[1+1]}
B=(1 2 3 "333")
C=([2]=1,[4]=9)
E=(123 [9]=0 345)
取出所有的数组
echo ${B[*]}一个数组元素组成的字符串
echo ${B[@]}空白隔开
计算数组个数
${#数组[@]} 或者是 ${#数组[*]}
for t in ; do
$t
done
测试数组长度
${#B[index]}
取消数组定义
unset B
取消数组元素取值
unset B[index]
#! /bin/bash
from='from: me@126.com'
To='To: you@126.com'
Subject='subject'
Msg='happy new year'
Em='test.txt'
cat > $Em<<EOF
$from
$To
$Subject
$Msg
EOF
HERE DOCUMENT 变量赋值
WOW="WOE,GREAN"
ml=$(cat<<EOF
Line 1 is good.
They are jack
$WOW
EOF)
cat <<-'HERE'
去掉TAB
HERE
HERE DOCUMENT 多行注释
:<<DO-NOTTHING
DO-NOTTHING
文档批注
:<<BASH-CODE
BASE-CODE
SHELL添加C代码
cat<<'EOF'>hello.c
#include
int main(){
printf("hellow\n");
return 0;
}
EOF
shell 变量测试
R=${myvar:-'chechi'}
测试变量是否存在并且判断变量是否为空
开启调试测试
[ -n ${DEBUG:-} ] && set -v
设置变量默认值
unset count
r=${count:=100}
${var:-替换字符串} 回传的结果一定要有非空值
测试变量不存在或者为空
${var:+替换字符串} 判断某事是否为真 测试存在且非空 符合条件 传回默认值
不符合条件传回空值
截取变量字符串长度
方法一
${var:起始位置}
${var:开始位置:结束位置}
${@:起点}
expr length ""
length=${expr length ""}
expr "":'.*'
${变量#样式} 由前面开始对比 删除最短的
${变量##样式}由前面开始对比 删除最长的
${变量%样式} 由后面开始对比 删除最短的
${变量%%样式}由后面开始对比 删除最长的
取代删除部分变量内容
替换第一个
${变量/:/,}
example
act=mail:x:8:8/var
r=${act/:/,}
echo $r
mail,x:8:8/var
全部替换
act=mail:x:8:8/var
r=${act//:/,}
echo $r
mail,x,8,8/var
${变量/#正则表达式/} 变量开头开始
${变量/%正则表达式/} 变量结尾开始
删除字符串
只删除一个
${变量/正则表达式/}
删除匹配
${变量//正则表达式/}
${变量//#正则表达式/} 变量开头开始
${变量//%正则表达式/} 变量结尾开始
获取数组索引
ar=(a b c)
r=${!ar[@]} 获取数组索引
转义命令
DIRS=$(ls)
for f in $DIRS do
echo $f
done
file="/etc/passwd"
IFS=' '
fc=$(cat $file) 另外一种写法 fc(<$fiel)
echo $fc
PDIR=$(cd..;pwd)
最后一个命令的执行结果赋给变量
数学运算
I=$((8+10))
echo $I
r='expr 8+9'
echo $r
r=$[4+6]
declare -i $var=4+9
let r=8+9
echo $((${j:-8}+3))
echo $((k+3))
r=$((++i))
i=10
((i++))
i=11
三元运算
((n=i<100?10:80))