脚本开发的理念:把复杂的命令执行过程,通过逻辑代码组成一个脚本文件,再去执行该文件。

脚本文件要声明解释器,#!
执行脚本的方式: 示例:
[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代码。
以下实例运行脚本接收用户输入的数字,并对运算符号判断,然后得出结果。
  1. 接收用户输入
  2. 对用户输入的是不是数字进行判断
  3. 对输入的运算符进行判断
  4. 进行计算并输出结果
函数的作用,把功能代码进行打包、封装成一个函数名,然后调用该函数名函数体中的代码就会执行。
实例:
[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