Shell脚本
发布时间:2020-12-15 18:18:53 所属栏目:安全 来源:网络整理
导读:Shell脚本: 特殊的后缀名的意义: .sh shell脚本文件 .py python脚本文件 .jsp Java网页文件 .repo yum仓库配置文件 .php php语言编写文件 .html html编写的网页文件 .db 数据库文件 Shell的作用:1、翻译官,解释用户输入的命令。2、用户的登录shell程序,
Shell脚本: 特殊的后缀名的意义: .sh shell脚本文件 .py python脚本文件 .jsp Java网页文件 .repo yum仓库配置文件 .php php语言编写文件 .html html编写的网页文件 .db 数据库文件
Shell的作用: 1、翻译官,解释用户输入的命令。 2、用户的登录shell程序,默认为/bin/bash 3、shell脚本文件,编写脚本代码必须有执行权限。 Shell脚本的执行方式: 1、脚本的路径: 绝对路径 root/first.sh 相对路径 首先切换到脚本文件所在的目录,然后用”./脚本名”去执行。 注:必须脚本文件要有执行权限。 2、sh脚本路径: 方法一:绝对路径 sh /opt/first.sh 方法二:相对路径 首先切换到脚本文件所在的目录,然后用”sh 脚本名”去执行。 3、source脚本路径: 方法一:绝对路径 source /opt/first.sh 方法二:相对路径 首先切换到脚本文件所在的目录,然后用”source 脚本名”去执行。 Shell脚本的构成: 1、脚本声明 #!/bin/bash 声明后面的命令可以通过此shell程序去解释并执行。 2、注释信息 摘要、脚本的作用、参数说明、工作效率、创建日期、作者、版本声明、第几次的修改、每次返回的动态值得定义等 3、可执行的命令语句 注:所有特殊符号必须是英文模式输入。 四大剑客:awk,sed,egrep,grep 管道符号的作用:将管道符号左侧的命令执行的结果,作为右侧命令的处理对象。 重定向操作:
自定义变量(小总结): 1、声明变量不需要声明类型 2、可以存储不同类型内容 A=weixin01 3、有时候使用变量时要明确变量类型 4、严格区分大小写 5、等于号两边不允许出现空格 6、首个字符必须是字母(a-z,A-Z或者_) 7、不能使用标点符号作为变量名 8、不能使用bash里面的关键字作为变量名 最基本的赋值方法: 格式:变量名=变量值 等于号两边不允许为空格。 查看变量 格式:echo $变量名 echo ${变量名} 通过echo进行一个输出变量,其中$是引用变量的特殊字符是特殊字符(必须要使用$符号)。 注:echo和调用的变量之间必须要有空格 当需要一起调用多个变量时,以空格隔开 当变量名和后面的字符混淆的时候,因使用{}将变量名括起来 变量赋值的特殊方法: 1、双引号“” 注:echo和调用的变量之间必须要有空格 当需要一起调用多个变量时,以空格隔开 2、单引号‘’ 所见即所得 禁止应用变量值,将$符号当作普通字符来使用 3、反撇号 `` 与$()效果一样 作用:命令替换,提取命令执行的结果 ls -l `which useradd` 优先执行反撇号里面的命令,在执行其他 变量赋值的时候,如果要赋值的是某条命令执行的结果,必须使用反撇号 缺点:反撇号不是实现嵌套命令替换操作,这时候使用$()来代替。 rpm -qc $(rpm -qf $(which useradd)) A=`rpm -qc $(rpm -qf $(which useradd))` A=$(rpm -qc $(rpm -qf $(which useradd))) 4、交互式赋值 read read命令用于提示用户输入信息,从而实现简单交互过程 (输入命令就是一种交互式的过程) 多个变量名交互式赋值,赋值之间有空格,变量名也有空格。 为了更友好,通常使用-p来设置提示信息 只是在当前shell程序中定义一个变量,但是到其他shell程序中无法引用 设置变量的作用范围: export 变量名=变量值 设置全值变量,所有子shell程序都可以使用此变量 数值变量的运算: expr $(()) 加加:++ 减减:-- 2的n次方:2**n 环境变量: 常见的环境变量: PWD:显示当前所在的工作目录 USER:用户的名称,可以查看当前登录的用户 HOME:用户的加目录,显示当前用户的家目录 LANG:语言和字符集变量 PATH:命令搜索路径,可以用tab键补全 PS1:提示符变量 位置变量: 方便通过命令行为程序提供操作参数。 当执行命令时,第一个字段表示命令名或者脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量 第一个字段位置变量是$0 第二个字段位置变量是$1 第三个字段位置变量是$2 例子: ls /opt /bot /root /opt/a.sh /opt vi weizhi.sh #!/bin/bash sum=$(($1+$2)) echo”$1+$2=$sum” 预定义变量脚本: $#:代表命令行的位置变量的个数 $*:代表每个位置变量的内容 $?:返回上一次执行的结果,0为正确 执行,非0的代表异常(报错) $0:代表当前执行的命令或者程序名 条件测试: test 条件表达式 / 条件表达式 常用的测试操作符: -d 测试是否为目录 -e 测试目录或文件 -f 测试是否为文件 -r 测试当前用户是否有权限读取read -w 测试当前用户是否有权写入write 逻辑测试: &&:逻辑与(可改为"-a") ||:逻辑或(可改为"-o") !:逻辑否 整数值比较: -eq A=B -ne A≠B -gt A>B -lt A<B -le A<=B -ge A>=B 字符串比较: 格式1 [ 字符串1 = 字符串2 ] [ 字符串1 != 字符串2 ] 格式二 [ -z 字符串 ] =:第一个字符串与第二个字符串相同 !=:第一个字符串与第二个字符串不相同,其中”!”符号表示取反 -z:检查字符串是否为空,对于未定义或赋予空值得变量将视为空串 循环语句: for循环语句: 需要指定一个变量以及可以取值的取值列表,针对每一个不同的取值相同的命令序列,直到变量值用尽,退出循环 取值列表:for语句的执行条件,其中包括多个属性相同的对象,需要预先指定。 格式: for 变量名 in 取值列表 do 命令序列 done 注: for语句的操作对象为用户指定名称的变量 通过in关键字为改变量预先设置一个取值列表 多个取值之间以空格作为分隔 do~done之间是一个循环体 应用领域: 1、字符串取值列表: #!/bin/bash #字符串取值列表 for HOME in 北京 上海 广州 安徽 南京 do echo "$HOME欢迎你" done 2、文件取值列表: #!/bin/bash #文件取值列表(命令执行取值列表) i=1 for USER in $(cat /opt/a) do echo ”$i号用户:$USER” let i++ //循环加一 done 3、扫描ip地址: #!/bin/bash #扫描ip地址 for IP in 192.168.108.{1..254} //1到254 do ping -c 3 -i 0.2 -W 1 $IP &> /dev/null if [ $? -eq 0 ];then echo “$IP is up!!!” else echo “$IP is down!!!” fi done 要求:down的主机ip地址统计有多少个,up的有多少个?? #!/bin/bash #扫描ip地址 up=0 down=0 for IP in 192.168.108.{1..254} do ping -c 3 -i 0.2 -W 1 $IP &> /dev/null if [ $? -eq 0 ];then echo "$IP is up!!!" let up++ else echo "$IP is down!!!" let down++ fi done echo "up地址有=$up,down地址有=$down" 4、批量添加用户: 方法一:同一个姓 #!/bin/bash #批量添加用户 for A in teacher{1..5} do useradd $A echo 123 | passwd --stdin $A $> /dev/null done 方法二:不同姓名 vi b.txt lisi zhangsan wangwu jack #!/bin/bash #批量添加用户 for A in $(cat /opt/b) do useradd $A echo 123 | passwd --stdin $A $> /dev/null done while循环语句: while和for的区别 for语句非常适合用于列表对象无规律,且列表来源是固定的场合 while对于要求控制循环次数、操作对象按数字顺序编号,按特定条件执行重复操作。 重复测试某个条件时,只要条件成立就会反复执行(无限),除非强制终止,或者exit语句退出脚本 格式: while 条件测试操作(判断语句) do 命令序列 done 应用领域 1、批量添加用户 #!/bin/bash U=”student” i=1 while [ $i -le 10 ] do useradd $U$i echo 123 | passwd --stdin $U$i $> /dev/null let i++ done 2、交互式批量创建 #!/bin/bash read -p “请输入要创建用户的前缀:” X read -p “请输入要创建用户的个数:” M read -p “请输入用户的初始密码:” N i=1 while [ $i -le $10 ] do useradd $X$i echo “$N” | passwd --stdin $X$i $> /dev/null chage -d 0 $X$i let i++ done 3、猜价格游戏 #!/bin/bash P=$(($PANDOM%1000)) T=0 echo “商品实际价格范围0~999,请猜一猜看是多少?” while true do read -p “请输入猜测的价格数目:”INT let T++ if [ $INT -eq $P ];then echo “恭喜答对了,实际价格是$P” echo ”你总共猜测了$T次” exit 0 //正常退出脚本 elif [ $INT -gt $P ];then echo “太高了” else echo “太低了” fi done 作业:99乘法表 #!/bin/bash #for loop for (( i=1;i<=9;i++ )) do for (( j=1;j<=i;j++ )) do let "temp=i*j" echo -n "$i*$j=$temp " done echo "" done shell函数 格式: [ function ] 函数名(){ 命令序列 [return x] } 注: [ function ]是可写可不写,表示该函数的功能,可省略 ()里面是没有内容的,固定格式 执行的命令序列放在{}里面 [return x]的作用是当命令序列执行完后返回给系统一个值相当于echo $? 例子: 两个求和 #!/bin/bash sum(){ echo "你需要计算的两个整数分别是:$1和$2" SUM=$(($1+$2)) echo "$1 + $2 = $SUM" } sum $1 $2 单分支: if 条件测试操作 then 命令序列 fi 双分支: if 条件测试操作 then 命令序列1 else 命令序列2 fi 多分支: if 条件测试操作 then 命令序列1 elif 条件测试操作2 then 命令序列2 else 命令序列3 fi (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |