脚本开发的理念:把复杂的命令执行过程,通过逻辑代码组成一个脚本文件,再去执行该文件。
脚本文件要声明解释器,#!
执行脚本的方式:
- source命令
- . [脚本]
- bash [脚本]
- ./[脚本]
示例:
[lidapeng@X61s ~]$ cat test_date.sh
#! /usr/local/bin/bash
echo "当前日期时间是: `date`" 双引号可以识别里面的命令,单引号不能
[lidapeng@X61s ~]$ source test_date.sh
当前日期时间是: 2022年 5月12日 星期四 13时29分54秒 CST
[lidapeng@X61s ~]$ . test_date.sh
当前日期时间是: 2022年 5月12日 星期四 13时30分15秒 CST
[lidapeng@X61s ~]$ bash test_date.sh
当前日期时间是: 2022年 5月12日 星期四 13时31分30秒 CST
[lidapeng@X61s ~]$ chmod +x test_date.sh
[lidapeng@X61s ~]$ ./test_date.sh
当前日期时间是: 2022年 5月12日 星期四 13时31分59秒 CST
[lidapeng@X61s ~]$ cat echo_test.sh
#! /usr/local/bin/bash
#此脚本显示日期以及登录账号
echo "当前日期时间是: `date`"
date
echo ""
echo "Let's see who's logged into the system"
who
[lidapeng@X61s ~]$ bash echo_test.sh
当前日期时间是: 2022年 5月12日 星期四 13时38分20秒 CST
2022年 5月12日 星期四 13时38分20秒 CST
Let's see who's logged into the system
lidapeng pts/0 5月 12 13:17 (192.168.11.131)
[lidapeng@X61s ~]$ cat echo_var.sh
#! /usr/local/bin/bash
#显示用户个人信息
echo "用户名的user名称: $USER"
echo "用户的UID: $UID"
echo "用户家目录:"$HOME $USER、$UID、$HOME为系统变量,放在双引号内外皆可。
[lidapeng@X61s ~]$ bash echo_var.sh
用户名的user名称: lidapeng
用户的UID: 1001
用户家目录:/home/lidapeng
转义符,还原符号原本的含义,不会被阅读为特殊含义。双引号中如果要输出$符号,需要对其转义;单引号不需要转义。
示例:
[lidapeng@X61s ~]$ echo "$6999"
999
[lidapeng@X61s ~]$ echo "\$6999"
$6999
[lidapeng@X61s ~]$ echo '\$6999'
\$6999
[lidapeng@X61s ~]$ echo '$6999'
$6999
变量被引用的时候,会赋予其值,脚本中的变量在shell执行完毕后会消失(根据执行的方式决定)。
[lidapeng@X61s ~]$ cat make_var.sh
#! /usr/local/bin/bash
days=10
name="名字"
echo "$name 已经玩了 $days天了"
[lidapeng@X61s ~]$ chmod +x make_var.sh
[lidapeng@X61s ~]$ source make_var.sh
名字 已经玩了 10天了
[lidapeng@X61s ~]$ echo $name $days
名字 10
[lidapeng@X61s ~]$ unset name days
[lidapeng@X61s ~]$ . make_var.sh
名字 已经玩了 10天了
[lidapeng@X61s ~]$ echo $name $days
名字 10
以上两种方法直接在当前shell运行脚本,故变量值保留在当前shell中
[lidapeng@X61s ~]$ unset name days
[lidapeng@X61s ~]$ bash make_var.sh
名字 已经玩了 10天了
[lidapeng@X61s ~]$ echo $name $days
使用bash调用脚本,脚本在子shell中执行,完毕后回到父shell,变量值消失
[lidapeng@X61s ~]$ ./make_var.sh
名字 已经玩了 10天了
[lidapeng@X61s ~]$ echo $name $days
使用./调用脚本,脚本在子shell中执行,完毕后回到父shell,变量值消失
shell变量的替换引用
shell的一大特性:可以从命令的执行结果中再提取结果。提取方式:
- $()
在括号中执行命令并拿到结果
- ``反引号
执行反引号中的命令并拿到结果
[lidapeng@X61s ~]$ echo $(date)
2022年 5月12日 星期四 14时22分47秒 CST
[lidapeng@X61s ~]$ echo `date`
2022年 5月12日 星期四 14时22分58秒 CST
数学运算
常见的算术运算符号:
算术运算符 |
意义(*表示常用) |
+、- |
加法(或正号)、减法(或负号)* |
*、/、% |
乘法、除法、取余(取模)* |
** |
幂运算* |
++、-- |
增加或减少,可前置也可放在变量结尾* |
!、&&、|| |
逻辑非(取反)、逻辑与、逻辑或* |
<、<=、>、>= |
比较符号(小于、小于等于、大于、大于等于) |
==、!=、= |
比较符号(相等、不相等,对于字符串"="也可以表示相当于)* |
<<、>> |
向左移位、向右移位 |
~、|、&、^ |
按位取反、按位亦或、按位与、按位或 |
=、+=、-=、*=、/=、%= |
赋值运算符,例如a+=1相当于a=a+1;a-=1相当于a=a-1 * |
shell中常见的算术运行命令:
运算操作符与运算命令 |
意义 |
(()) |
用于整数运算的常用运算符,效率很高 |
let |
用于整数运算,类似于“(())” |
expr |
可用于整数运行,但还有很多其他额外功能 |
bc |
Linux下的一个计算器程序(适合整数及小数运算) |
$[] |
用于整数运算 |
awk |
既可以用于整数运算,也可以用于小数运算 |
declear |
定义变量值和属性,-i参数可以用于定义整形变量,做运算 |
(())
双小括号的操作方法
运算操作符与运算命令 |
命令 |
((i=i+1)) |
此为运算后赋值法,即将i+1的运算结果赋值给变量i。 注意不能用"echo ((i=i+1))"的形式输出表达式的值,但可以用"echo $((i=i+1))"输出其值 |
i=$((i+1)) |
可以在(())前加$符,表示将表达式运算后的结果赋值给i |
((8>7&&5==5)) |
可以进行比较操作,还可以加入逻辑与和逻辑或,用于条件判断 |
echo $((2+1)) |
需要直接输出运算表达式的结果时,可以在(())前加$符 |
实例:
[lidapeng@X61s ~]$ num=5
[lidapeng@X61s ~]$ echo $((num*3))
15
[lidapeng@X61s ~]$ t1=16
[lidapeng@X61s ~]$ echo $((num+t1))
21
[lidapeng@X61s ~]$ echo $((a=2+2**3-4%3))
9
[lidapeng@X61s ~]$ echo $a
9
[lidapeng@X61s ~]$ b=$((2+2**3-4%3))
[lidapeng@X61s ~]$ echo $b
9
++、--
++a,表示先计算+1,然后赋值给a;a++,表示先提取a,然后计算+1。
实例:
[lidapeng@X61s ~]$ a=5
[lidapeng@X61s ~]$ echo $((++a))
6
[lidapeng@X61s ~]$ echo $((++a))
7
[lidapeng@X61s ~]$ echo $((++a))
8
[lidapeng@X61s ~]$ echo $((++a))
9
[lidapeng@X61s ~]$ echo $a
9
[lidapeng@X61s ~]$ echo $((a++))
9
[lidapeng@X61s ~]$ echo $((a++))
10
[lidapeng@X61s ~]$ echo $((a++))
11
[lidapeng@X61s ~]$ echo $((a++))
12
[lidapeng@X61s ~]$ echo $a
13
判断用户输入
想好脚本的功能、作用及需求,然后再转换成shell代码。
以下实例运行脚本接收用户输入的数字,并对运算符号判断,然后得出结果。
- 接收用户输入
- 对用户输入的是不是数字进行判断
- 对输入的运算符进行判断
- 进行计算并输出结果
函数的作用,把功能代码进行打包、封装成一个函数名,然后调用该函数名函数体中的代码就会执行。
实例:
[lidapeng@X61s ~]$ cat calc.sh
#!/usr/local/bin/bash
# 以下函数告诉用户应该输入什么
print_usage(){
printf "你输入的不是数字\n"
# 以下给脚本的执行结果赋予一个退出状态码
exit 1
}
# 接收用户输入的命令, -p参数后面是给用户看到的提示信息
# 提示信息后面指定接收用户输入的变量
read -p "请输入数字:" firstnum
# 用if语句判单用户的输入,限制必须为纯数字
# if的判断语句用中括号包裹,且中括号里面前后都有空格,即里面的字符不能与中括号挨着
# -n参数是if的语句,对字符判断,如果字符串为空则条件不成立,如果字符串不为空则条件成立
# sed的作用是将所有数字替换为空,如果结果为空,表示用户输入的都是数字;否则就打印错误提示。
if [ -n "`echo $fistnum|sed 's/[0-9]//g'`" ]
then
print_usage
fi
# 然后接收运算符,!=符号前后都要有空格
read -p "请输入运算符:" operator
if [ "${operator}" != "+" ] && [ "${operator}" != "-" ] && [ "${operator}" != "*" ] && [ "${operator}" != "/" ]
then
echo "只能输入 + - * /"
exit 2
fi
# 对第二个变量进行处理:
read -p "请输入第二个数字:" secondnum
if [ -n "`echo $secondnum|sed 's/[0-9]//g'`" ]
then
print_usage
fi
# 数值计算
echo "${firstnum}${operator}${secondnum}结果是:"$((${firstnum}${operator}${secondnum}))
[lidapeng@X61s ~]$ bash calc.sh
请输入数字:4
请输入运算符:+
请输入第二个数字:5
4+5结果是:9