一般命令
1、增加用户
useradd -c demo_user -d /home/demo -e 2023-03-02 root -s
用户名为demo,用户全称为demo_user,用户的家目录为/home/demo,用户demo的过期日期为2023-03-02,用户的基本组为root,登录系统Shell解析器为bash
2、修改密码
passwd -w 10 demo_user
将用户demo_user的密码修改为admin,并设置过期警告天数为10天
3、增加用户组
groupadd -o -g 1008 same
将用户demo的密码修改为admin,并设置过期警告天数为10天
4、修改用户
usermod -u 1002 demo
usermod -d /home/share demo
usermod -s /bin/sh demo
groupmod -g 1009 same
修改用户demo的UID为1002,用户家目录为/home/share,并修改Shell解析器为/bin/sh
5、删除用户和用户组
userdel demo
groupdel same
修改用户demo的UID为1002,用户家目录为/home/share,并修改Shell解析器为/bin/sh
条件判断:if 、[[$a -lt $b]]、test等
循环语句:for、while、until
后台执行符:&:问题-无法控制进程数
控制进程数的核心:文件描述符和管道
shell脚本示例
set -e #set +e命令遇到错误会继续执行,-e遇到错误停止运行
DEPLOY_DIR=test
USE_FILE=test.txt
if [ $# -ge 1 ]
then
DEPLOY_DIR=$1
fi
if [ $# -eq 2 ]
then
USE_FILE=$2
fi
mkdir $DEPLOY_DIR
cd test
touch $USE_FILE
echo "hello">>$USE_FILE
cat $USE_FILE
cd ..
rm -rf $DEPLOY_DIR
对字符的操作
#对字符串切片
echo "去掉前面两个字符:${var1:2}"
echo "从第3个字符开始,连续取3个字符:${var1:2:3}"
#删除某个子串 # ## % %%删除匹配字串。
# #和##是从左开始删除匹配
# % %%是从右开始删除匹配
echo "从左边删除最小匹配:x*a,结果为:${var1#x*a}"
#替换
echo "替换xxx字串为1234,结果:${var1/xxx/1234}" #只会替换第1个
echo "替换xxx字串为1234,结果:${var1//xxx/1234}" #匹配后全部替换
echo "从头开始匹配替换用#。结果:${var1/#xxx/hi}"
echo "从尾开始匹配替换用%。结果:${var1/%xxx/hi}"
#设置变量
echo "变量var3的值:${var3:-xyz}" #var3未定义,给默认值为xyz
变量的操作
var1=hello
echo "${var1}_xyz"
var2=123
#declare -i 指定整型,-r 只读变量 -a指定数组 -f指定函数名
declare -i var3
var3=245
echo "\$var3=$var3"
declare >/dev/null #输出系统中定义的变量,包括系统变量和自定义变量
declare | grep ^var1
#declare同义命令set
#删除命令unset
unset var1
#``反引号,${}:获取里面的Linux执行结果
LOCAL_IP=`cat /etc/hosts|grep \`hostname\`|awk '{print $1}'`
LOCAL_IP_OTHER=$(cat /etc/hosts|grep `hostname`|awk '{print $1}')
循环的内容
#!/bin/bash
for a in xx abc zzz
do
echo "循环变量:$a"
done
#遍历数组元素
arr1=(xx yy "hello world" 12)
for a in "${arr1[@]}"
do
echo "遍历数组元素:$a"
done
#遍历linux命令
for i in `seq 1 10`
do
echo $i
done
#改变内置的分隔符
OLD_IFS=$IFS
IFS=$'\n'
echo "调整内置的分隔符后..."
for line in `cat test_for.txt`
do
echo "循环变量:$line"
done
#while循环
sum=0
i=0
while [ $i -le 100 ]
do
let "sum += $i"
let "i++"
done
echo "计算结构:1+2+...+100=$sum"
#until的用法
sum=0
i=0
until [ $i -gt 100 ]
do
let "sum += $i"
let "i++"
done
until ! read ch en
do
echo ""
done < test_while.txt
if的内容
#!/bin/bash
# if 判断语句: then
# elif 继续判断
# else
# fi
x="abc"
if[ $x='abc' ];then #记得和中括号之间有空格
echo "x=abc"
else
echo "x!=abc"
fi
#字符串判断 > < = !=
#数值判断 -gt -lt -ge -le -eq
# -e 文件路径:判断文件是否存在
# -d :判断是否为目录
# -z "变量": 如果变量为空,则条件成立
# -n "变量": 如果变量不为空,则条件成立
DATA_DIR=$1
if[ -z "DATA_DIR" ];then
echo "请输入一个目录"
exit 1
fi
if[ !-d "$DATA_DIR"];then
echo "请输入一个正确的目录"
exit
fi
#可以判断命令
if ls;then
echo "执行成功"
fi
#可以判断函数
xyz(){
echo "执行xyz()函数"
return 1 # $?
}
if xyz;then
echo "函数执行成功"
else
echo "函数执行失败"
fi
#可以使用双括号
if[[ -e "/root" ]]
then
echo "/root路径存在"
fi
#if中的条件与、或
if [ -e "/root"] && [-d "/tmp"];then
echo ""
fi
计算的内容
#!/bin/bash
#expr命令
a=`expr 3 + 2` #加号前后要加空格
echo $a
b=`expr $a \* 10`
echo "$a*10=$b"
#let命令
let "a += 10"
let "a/=10"
echo "a=$a"
let "a++"
let "a--"
#使用双括号
((b++))
echo "b自增后的值:$b"
((b%=10))
echo "取余10后,b的值为$b"
#使用bc命令,进行浮点数的计算
echo "scale=2;1.2*1.2_0.2" | bc
数组的内容
#!/bin/bash
arr1=(xxx yyy zzz)
echo "数组arr1的长度:${#arr1[@]}"
echo "数组arr1的长度:${#arr1[*]}"
echo "${#arr1}" #如果没有加上索引,数组名表示的是第一个元素
arr2[0]=abc
arr2[1]=xyz
arr2[2]=zzz
echo "arr2数组内容:${arr2[@]}"
end_len=${#arr2[@]}
end_index=`expr $end_len -1`
#常用的遍历数组的方式
for i in `seq 0 $end_index`
do
pos=`expr $i + 1`
echo "arr2中第${pos}位置的元素为:${arr2[$i]}"
done
for ele in "${arr2[@]}"
do
echo "arr2中第${count}元素为:${ele}"
count=`expr $count + 1`
done
echo的内容
#!/bin/bash
echo "hello word"
var1="a b c d"
echo $var1
echo "$var1"
#echo常用选项
# -n:删除默认的换行符
# -e:使转义符生效,使颜色代码生效
echo "hello\nworl\td"
#echo输出带颜色的字符
echo "\033[31mhello\033[0m"
函数的内容
#!/bin/bash
xyz(){
echo "hello, function"
}
#调用函数,不加括号
xyz
#通过位置参数向函数传参
xyz_with_params(){
echo "函数传入参数个数为:$#"
for i in `seq 1 $#`
do
echo "第$i个位置参数:$1"
shift
done
}
xyz_with_params 111 222 333
#函数的返回值为$?
xyz_with_return(){
return 100 #返回值不能大于256
}
echo "$?"
if xyz_with_return
then
echo "成功"
else
echo "失败"
fi
文件通道符
#!/bin/bash
# 0 stdin 标准输入
# 1 stdout 标准输出
# 2 stderr 标准错误输出
exec 4</file.in
exec 5>/file.out
while read line
do
echo "文件内容:$line"
done <&4
#关闭文件描述符
exec 4<&
exec 5>&
#建立一个管道
pipe_path=/tmp/pipe1
[-e ${pipe_path}] || mkfifo $pipe_path
exec 7<>${pipe_path}
for i in `seq 1 5`
do
echo "向管道写入hello$i"
echo "hello$i" >&7
read -u7 name
echo "从管道中读取内容:"$name
done
进程
#!/bin/bash
#循环Ping
check_host(){
host=${host_prefix}.$1
if ping $host -c1 -W1 > /dev/null 2>/dev/null;then
echo "$host可达"
else
echo "$host不可达"
}
host_prefix=192.168.123
for i in `seq 2 254`
do
check_host $i &
done
磁盘容量的百分比大于90%时,发邮件的脚本
#!/bin/bash
percentage=`df | grep -n '/dev/sda' | awk '{print $5}' | sed 's/[^0-9\.]//g'`
#获取该服务器的信息
server=`ifconfig wlan | sed -n '2p'`
if [ $percentage -ge 90];
then
echo "服务器磁盘空间使用超过90%, $server | mail -s "server warning" 11@qq.com
else
echo "服务器磁盘空间使用征程"
fi
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。