shell脚本创建“三部曲”
#创建存放脚本文件目录:
[root@localhost ~]# mkdir -p /data/sh/2020-07-02/
[root@localhost ~]# cd /data/sh/2020-07-02/
#创建脚本文本文件:
[root@localhost 2020-07-02]# touch hello.sh
#写脚本语句:
[root@localhost 2020-07-02]# vim hello.sh
#!/bin/bash
#2020年7月2日20:01:08
#by author Xiaoyuer
####################################
echo "Hello World"
#添加执行权限:
[root@localhost 2020-07-02]# chmod +x hello.sh
#执行脚本验证:
[root@localhost 2020-07-02]# ./hello.sh
Hello World
########################################
#!脚本声明(使用哪种解释器)
#注释信息(步骤、思路、变量含义、用途等)
概念:以固定名称存放,可能会变化的值。
优点:提高脚本对任务的需求,运行环境变化的适应能力,方便在脚本中重复使用。
#定义变量yy,赋值1234
root@localhost 2020-07-02]# yy=1234
#输出变量值:
[root@localhost 2020-07-02]# echo $yy
1234
#变量名易混淆时以{}分开
[root@localhost 2020-07-02]# echo ${yy}6
12346
#取消变量
[root@localhost 2020-07-02]# unset yy
[root@localhost 2020-07-02]# echo $yy
以shell变量分类的角度分为两大类:
类型 | 说明 |
---|---|
环境变量 | 变量名通常是大写,由系统维护,用来设置工作环境,只有个别变量用户可以直接修改 |
位置变量 | bash内置,存储执行脚本时提供的参数 |
预定义变量 | bash内置,一类有特殊用途的变量,可直接调用,但不能直接赋值或修改。 |
自定义变量 | 由用户自主设置、修改及使用 |
环境变量:
预定义变量
变量名 | 含义 |
---|---|
$0 | 当前所在的进程或脚本名 |
$$ | 当前运行进程的PID号 |
$? | 命令执行后的返回状态,0表示正常,1或其他值表示异常 |
$# | 已加载的位置变量的个数 |
$* | 所有位置变量的值 |
位置变量
#!/bin/bash
#2020年7月2日20:01:08
#by author Xiaoyuer
####################################
cat $1 ----这里的$1就是位置变量
#输入脚本路径+为$1赋值:这里的意思是查看hello.sh文件内容
[root@localhost 2020-07-02]# ./first.sh hello.sh
#!/bin/bash
#2020年7月2日20:01:08
#by author Xiaoyuer
####################################
echo "Hello World"
> - 区分三种定界符:
> 1. 双引号" " :允许扩展,以$引用其他变量
> 2. 单引号' ' :禁用扩展,即便$也视为普通字符
> 3. 反撇号` ` :将命令的执行输出作为变量值
例:
[root@localhost 2020-07-02]# echo "当前用户是$USER"
当前用户是root
[root@localhost 2020-07-02]# echo '当前用户是$USER'
当前用户是$USER
[root@localhost 2020-07-02]# yy=pwd
[root@localhost 2020-07-02]# echo $yy
pwd
[root@localhost 2020-07-02]# yy=`pwd`
[root@localhost 2020-07-02]# echo $yy
/data/sh/2020-07-02
提示:$()和``等效,但$()更方便嵌套使用
read 从键盘读入变量值完成赋值:
- 格式:read [-p "提示信息”] 变量名
- -p可选,-t可指定超时秒数
终端显示控制:
- stty -echo :关闭终端输出(无显示)
- stty echo :恢复终端输出(显示)
例:
[root@localhost 2020-07-02]# vim add_user.sh
#!/bin/bash
#2020年7月2日20:01:08
#by author Xiaoyuer
####################################
read -p "请输入你要创建的用户:" USER
read -p "请为你创建的用户设置密码:" PASSWD
useradd $USER &>/dev/null
echo "用户创建成功"
echo $PASSWD | passwd --stdin $USER &>/dev/null
echo "密码设置成功"
[root@localhost 2020-07-02]# chmod +x add_user.sh
[root@localhost 2020-07-02]# ./add_user.sh
请输入你要创建的用户:xiaoming
请为你创建的用户设置密码:1234
用户创建成功
密码设置成功
#修改脚本输入密码时无法显示出来:
[root@localhost 2020-07-02]# vim add_user_v2.sh
#!/bin/bash
#2020年7月2日20:01:08
#by author Xiaoyuer
####################################
read -p "请输入你要创建的用户:" USER
stty -echo ----关闭终端输入
read -p "请为你创建的用户设置密码:" PASSWD
stty echo ---恢复终端输入
useradd $USER &>/dev/null
echo
echo "用户创建成功"
echo $PASSWD | passwd --stdin $USER &>/dev/null
echo "密码设置成功"
[root@localhost 2020-07-02]# chmod +x ./add_user_v2.sh
[root@localhost 2020-07-02]# ./add_user_v2.sh
请输入你要创建的用户:sxy
请为你创建的用户设置密码:
用户创建成功
密码设置成功
export +变量名 ---为局部变量添加全局属性
export -n +变量名 取消指定变量的全局属性
[root@localhost ~]# bb=123
[root@localhost ~]# echo $bb
123
[root@localhost ~]# export "bb"
[root@localhost ~]# sh
sh-4.2# echo $bb
123
[root@localhost ~]# export -n "bb"
[root@localhost ~]# echo $bb
123
[root@localhost ~]# sh
sh-4.2# echo $bb
四则运算:
1. 加法 : num1 + num2
2. 减法 : num1 - num2
3. 乘法 : num1 * num2
4. 整除 : num1 / num2
去余数运算:
- 求模 :num1 % num2
- 计算指定的表达式,并输出结果
- 格式:expr 整数1 运算符 整数2 .......
- 乘法操作应采用 \* 转义,避免被作为shell通配符
例:
[root@localhost ~]# expr 2 + 4
6
[root@localhost ~]# expr 4 - 3
1
[root@localhost ~]# expr 2 \* 4
8
[root@localhost ~]# expr 4 / 2
2
[root@localhost ~]# expr 5 % 2 ---这里是取余数,5除以2余1
1
注意:expr和num1之间需要空格,num和运算符之间也需要空格
- 使用$[]或$(())表达式
- 格式:$[整数1 运算符 整数2....]
- 乘法操作 * 无需转义,运算符两侧可以无空格。
- 引用变量可省略 $ 符号
- 计算结果替换表达式本身,可结合echo命令输出
例:
[root@localhost ~]# X=30
[root@localhost ~]# echo $[X+20]
50
[root@localhost ~]# echo $((X-20))
10
[root@localhost ~]# echo $X
30
[root@localhost ~]# echo $[X*2]
60
[root@localhost ~]# echo $[X/2]
15
[root@localhost ~]# echo $[X%20]
10
注意以上操作不会改变变量原来的值
简写表达式 | 完整表达式 |
---|---|
i++ | i=i+1 |
i- - | i=i-1 |
i+=2 | i=i+2 |
i-=2 | i=i-2 |
i*=2 | i=i*2 |
i%=2 | i=i%2 |
[root@localhost ~]# i=20
[root@localhost ~]# echo $[i+=2]
22
[root@localhost ~]# echo $[i*=2]
44
[root@localhost ~]# echo $[i/=2]
22
[root@localhost ~]# echo $[i%=3]
1
[root@localhost ~]# echo $i
1
[root@localhost ~]# let i+=30;echo $i
31
提示:从上面的操作可以看得出来,以上操作可以改变变量i的值
[root@localhost ~]# expr 2 + 2.5
expr: 非整数参数
[root@localhost ~]# echo $[2+2.5]
-bash: 2+2.5: 语法错误: 无效的算术运算符 (错误符号是 ".5")
[root@localhost ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
2.2+2.5
4.7
100/3 ----这里可以看得出来100除以3是无限循环小数但是得出的结果是33
33
scale=4 ---这里约束小数位为4
100/3 ----再次100除以3得出的是33.3333
33.3333
2*6 ---可以看得出来这里也可以整数运算
12
[root@localhost ~]# A=12.34
[root@localhost ~]# echo "$A*12.45" |bc
153.63
[root@localhost ~]# B=12.340
[root@localhost ~]# echo "$B*12.45"|bc
153.633
以上操作可以得出以下结论未设置约束小数位时输出结果和变量值的小数位一样
[root@localhost ~]# echo "scale=4;$A*12.45"|bc
153.6330
[root@localhost ~]# echo "scale=4;$A*13.35;4/2"|bc
164.7390
2.0000
基本用法:
[root@localhost ~]# A=12.34
[root@localhost ~]# B=15.34
#判断12.34小于等于15.34得出的结果是1,代表是正确的
[root@localhost ~]# echo "$A<=$B" |bc
1
#判断12.34等于15.34得出的结果是0代表是不正确的
[root@localhost ~]# echo "$A==$B"|bc
0
[root@localhost ~]# Q=10
[root@localhost ~]# W=20
[root@localhost ~]# echo "$Q==$W"|bc
0
[root@localhost ~]# echo "$Q<=$W"|bc
1