shell基础知识
硬件-》系统核心-》命令解释器-》外围应用程序
查看默认shell
cat /etc/passwd | head -1
echo $SHELL
建立脚本
#!/bin/bash 指定解释器
#!幻数
#!/bin/bash
yum repolist
yum install httpd -y
systemctl enable httpd
systemctl start httpd
systemctl status httpd
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
firewall-cmd --list-all
脚本缺陷
1用户判断
2是否执行
#!/bin/bash
LOG_DIR=/var/log
ROOT_UID=0
if ["$UID" -ne "$ROOT_UID"];then
echo "ERROR:you should be root to run this script!"
exit 1
fi
cd $LOG_DIR || { #|| 前面的运行了,就不运行后面的了,二选一
echo "CANNOT access to directory"
exit 1
}
cat /dev/null > messages && {
echo "Logs cleaned up."
exit 0 #正常退出0 异常退出1
}
echo "Logs cleaned failed..."
exit 1
查看系统环境变量
env
脚本执行方法
1 sh script.sh | bash name.sh 没有执行权限时使用
这时执行 是新打开一个shell执行完再返回数据,这时候并不会在现在的shell中可以使用这些值,就会变为空 比如$username
2 /path/to/name.sh | ./script.sh 绝对路径,当前目录
3 source name.sh | . script.sh 把执行后产生shell的值或函数传回原来的shell继续使用
leetcode
func WESTOS()
call append(0,"# Author: wsp".(" "))
call append(1,"# Version: ".(" "))
call append(2,"# Mail: ".(" "))
call append(3,"# Date: ".strftime("%Y-%m-%d").(" "))
call append(4,"# Description: ".(" "))
call append(5,"# ".(" "))
call append(6," ")
call append(7,"#!/bin/bash")
endfunc
cat /etc/shells
a=hello 不能定义有空格的
b='hello' 默认不解析''里面的东西,原样输出
c="hello" 可以定义有空格的
###特殊变量
$0
代表脚本本身 执行后,sh执行获取名称 绝对路径执行会获取路径
$n ${10}
要大于0,任意一个数 执行参数 写几个 执行的时候就要写几个变量
$# 表示后面输入参数的个数
$* 获取所有参数
$@ 获取所有参数
$? 检测是否成功 0表示执行成功
$$ 获取当前shell进程号
read用法
read -p "请输入一个整数:" i
10
echo $i
日志目录打包成当天日期
#!/bin/bash
time=`date +%Y-%m-%d` date +%F 一样
tar zcf log_${time}.tar.gz /var/log/messages
变量值的计算
bc 计算器
echo 1.23+3.3 | bc
echo "scale=3;1.11*2.22" |bc
scale保留位数
a=10
expr $a + 10
expr $a \* 10 乘法需要转义
expr $a / 10 除法
echo $[a*1] 不需要转义
echo $((a*1))
let会更改值
let a+=10
这时a=20
echo a-b=`echo "$a*$b" |bc`
echo "a-b=$[a-b]"
#!/bin/bash
read -t 5 -p "输入两个整数" a b
#a=$1
#b=$2
echo a-b=`echo "$a-$b" |bc`
echo a*b=`echo "$a*$b" |bc`
echo a+b=`echo "$a+$b" |bc`
echo a/b=`echo "scale=3;$a/$b" |bc`
echo a^b=`echo "$a^$b" |bc`
echo a%b=`echo "$a%$b" |bc`
但是[] ()中的幂函数用**
grep sed awk
grep
egrep= grep -E
grep -i 忽略字母大小写
-v 条件区反
-c 统计匹配行数
-q 静默无输出
-n 显示匹配结果所在的行号
-m10 只看结果的前10行
egrep '^root|^daemon' /etc/passwd
grep '172.25.254.250' /etc/hosts && echo 'yes'||echo 'no'
glob
^匹配开头
&匹配结尾
.匹配任意字符
'.'可过滤非空行
-v '.' 或者 '^&' 过滤空行
[]匹配括号内的字符
[^a] 不匹配a
基本元字符 + ? *
'n+' 至少一个n
'color(ful)?' 最多一次出现(ful)
* 所有 不管几次
匹配次数
{n} n次
{n,m} n-m次
或的匹配,出现括号里面的都会匹配
[ab]
[A-X]
cut -d: -f 1,7 /etc/passwd
显示1-7列 以:为分隔符
cut -c 1,4 /etc/passwd
显示1-4列的字符
过滤自己的ip
ifconfig |egrep -m1 'inet '| cut -c 14-25
ifconfig eth0 |egrep -m1 'inet '| cut -d " " -f 10
ifconfig |egrep -m1 'inet '| awk '{print $2}'
判断是否ping成功
ping 172.25.254.11 -c1 -w1 &> /dev/null && echo '172.25.254.11 is up' || echo '172.25.254.11 is down'
sort 排序
-n 纯数字排序(按大小)
-r 倒序
-u 去掉重复数字
-o 输出到制定文件
-t 制定分隔符
-k 制定要排序的列
sort t : -k 2 /path 你找出他的分隔符然后选择你要排序的列为2
ps -ax -o %cpu,pid --sort=-%cpu |grep -v PID|head -n 5
uniq 对重复命令处理
-u显示唯一的行
-d显示重复的行
-c每行显示一次并统计重复次数
ctrl+v 块可视化
shift+v 行可视化
ls -Sl /tmp| head -n 2|cut -d ' ' -f 9
ll /tmp | sort -r -t ' ' -k 6| head -n 1|cut -d ' ' -f 9
ll /etc | sort -t ' ' -k 4| tail -n1|grep -m2 '.*'|cut -d ' ' -f 19
ls -Sl 排大小
test 命令
test "$a" == "$b"
[ 1 -eq 2 ]
[ "$a" = "$b" ] !=不等于 -ne
-le 小于等于
-ge 大于等于
-gt 大于
-lt 小于
-ne 不等与
-eq等于
-a 与
-o 或
-z 是否为空(zero) 为空则继续运行&&后面的,返回1
-e "file" 存在
-f "file" 是否普通文件
-b " " 块设备
-S 套接字
-c 字符设备
-L 软件接
1输入是否为空
2是否在10以内
3 1<$a<10 -->yes
4 $a<1 $a>10 -->no
#!/bin/bash
#判断数字是否在10以内
[ -z "$1" ]&&echo no&&exit 0||[ "$1" -lt 1 ] &&echo 'no' && exit 0|| [ "$1" -gt 10 ] && echo 'no' && exit 0||echo yes &&exit 0
判断文件类型
#!/bin/bash
[ -z "$1" ]&&echo input a file&&exit 1
[ ! -e "$1" ]&&echo file not exist&&exit 1
[ -f "$1" ]&&echo f&&exit 0
[ -b "$1" ]&&echo b&&exit 0
[ -S "$1" ]&&echo S&&exit 0
[ -C "$1" ]&&echo c&&exit 0
[ -L "$1" ]&&echo L&&exit 0
[ -d "$1" ]&&echo d&&exit 0
lftp mirror拷贝目录