shell 编程学习杂记

发布于:2023-05-25 ⋅ 阅读:(62) ⋅ 点赞:(0)

一般命令
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
本文含有隐藏内容,请 开通VIP 后查看