shell学习笔记

发布于:2025-06-22 ⋅ 阅读:(13) ⋅ 点赞:(0)

一  常见shell引号用法

  • 单引号' ':所见即所得,强引用
  • 双引号" ":输出引号里所有内容,识别特殊符号,弱引用
  • 无引号,连续的符号可以不加引1号,有空格则有歧义,最好使用双引号
  • 反引号‘ ’:引用命令执行结果,等于 $()用法

shell特殊变量

shell的特殊变量,用在如脚本,函数传递参数使用,有如下特殊的,位置参数变量

  • $0                 获取shell脚本文件名,以及脚本路径
  • $n                获取shell脚本的第n个参数,n在1~9之间,如$1,$2,$9,大于9则需要写,                           ${10},參数空格隔开
  • $#                获取执行的shell脚本后面的参数总个数
  • $*                获取she11脚本所有参数,不加引号等同于s作用,加上引号“$*“作用是 接收所有参数                为单个字符串,“$1 $2⋯
  • $@                不加引号,效果同上,加引号,是接收所有参数为独立字符串,如”$1” “$2”                             空格保留

二 shell编程

base内置命令

命令 解释
echo

答打印

-n  不换行输出

-e  解析字符串中的特殊符号

\n  换行

\r  回车

\t  制表符,4个空格

\b  退格

printf 打印

eval

执行多个命令

┌──(root㉿kali)-[/home/liangjian/shell]
└─# eval ls;cd /test   
study01.shell
                                                                                                            
┌──(root㉿kali)-[/test]
└─# 
 

exec 不创建子进程,执行后续命令,执行完毕后exit
export 利用数值计算,统计字符串的长度
read
shift

shell字串

┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo {$name} 
{liangjian}
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${#name}            
9
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${name:5}
jian
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${name:5:2}
ji

##字符串替换
┌──(root㉿kali)-[/home/liangjian/shell]
└─# string="hello,i am your brouter"
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${string}       
hello,i am your brouter
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${string/i/I}           
hello,I am your brouter
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${string//o/O}
hellO,i am yOur brOuter

##删除文件名--批量修改

常见文件即数据源:
┌──(root㉿kali)-[/home/liangjian/shell]
└─# mkdir sub_str 
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# ls
study01.shell  sub_str
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# 
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# 
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# touch liangjian_{1..5}_picture.jpg
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# touch liangjian_{1..5}_picture.png
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# ls -l                           
总计 4
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_1_picture.jpg
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_1_picture.png
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_2_picture.jpg
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_2_picture.png
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_3_picture.jpg
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_3_picture.png
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_4_picture.jpg
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_4_picture.png
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_5_picture.jpg
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_5_picture.png
-rw-rw-r-- 1 root root    0  6月18日 15:00 study01.shell
drwxrwxr-x 2 root root 4096  6月18日 17:07 sub_str

##需求:
1、去掉所有文件的_picture 字符。
思路1:单个文件单独修改。
    mv liangjian_1_picture.jpg liangjian_1.jpg

思路2:利用变量的子串功能去掉后缀。
┌──(root㉿kali)-[/home/liangjian/shell]
└─# f=liangjian_1_picture.png
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${f}          
liangjian_1_picture.png
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${f//_picture/}
liangjian_1.png


思路3:利用反引号修改文件名
┌──(root㉿kali)-[/home/liangjian/shell]
└─# mv $f `echo ${f//_picture/}`     ## `` 反引号为取值       
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# ls -l
总计 4
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_1.jpg
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_1.png
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_2_picture.jpg
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_2_picture.png
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_3_picture.jpg
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_3_picture.png
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_4_picture.jpg
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_4_picture.png
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_5_picture.jpg
-rw-rw-r-- 1 root root    0  6月18日 17:09 liangjian_5_picture.png
-rw-rw-r-- 1 root root    0  6月18日 15:00 study01.shell
drwxrwxr-x 2 root root 4096  6月18日 17:07 sub_str


思路4:批量文件名替换--for循环

for file_mame in `ls *pic*.jpg`;do mv $file_name `echo ${file_name//_picture/}` ;done    

特殊shell扩展变量

语法介绍:


 

实践1:【:-】 liangjian这个变量为空

┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo $liangjian     

                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# result=${liangjian:-hello word!}
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${liangjian}   

                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${result}   
hello word!

###若变量值不为空,则word相当于不存在给,直接把part的值返回给result,result2=echo  $liangjian

┌──(root㉿kali)-[/home/liangjian/shell]
└─# liangjian=666                                                                        
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# result2=${liangjian:-hello word !}
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${liangjian}
666
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${result2}  
666


实践2:【:=】  word赋值给part和result ,此时echo $lyq 为空

┌──(root㉿kali)-[/home/liangjian/shell]
└─# result=${lyq:=appid}            
                                                                                                            
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${result};echo ${lyq}      
appid
appid


实践3:【:?】
### 如果变量lyq为空,则返回错误。 或者返回后面的字符串内容。如果该变量lyq有值,则后面的变量当作不存在处理。

┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${lyq:?}
bash: lyq: 参数为空或未设置
                                                                                                                                                                             

┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${lyq:?hello,word}                                                                                                                                                              
bash: lyq: hello,word

###lyq有值的情况
┌──(root㉿kali)-[/home/liangjian/shell]
└─# lyq=love1314                                                                                                                                                                         

┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${lyq:?hello,word}                                                                                                                                                              
love1314



实践4:【:+】 
###当变量result值为空,则什么都不做。否则字符返回给接收者。
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${result:+result没有值的情况}                                                                                                                                               


┌──(root㉿kali)-[/home/liangjian/shell]
└─# result=hello,word                                                                                                                                                                           


┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo ${result:+你好呀,妹妹}                                                                                                                                                     
你好呀,妹妹

写一个数据备份中,删除过期数据的脚本

┌──(root㉿kali)-[/home/liangjian/shell]
└─# #删除mysql_back_data备份文件,其所在目录假设为:dir_path=/data/mysql_back_data/ 删除的数据文件名为:del_data.sh,此时,可以如下写代码:

###${dir_path:+/data/mysql_back_data/}  如果dir-path的值为空,则把/data/mysql_back_data/的值返回给dir-path
### find发现的值,丢给xargs删除。

┌──(root㉿kali)-[/home/liangjian/shell]
└─# find ${dir_path:+/data/mysql_back_data/} -name `*.tar.gz` -type f -mtime +7 |xargs  rm -fsc

特殊shell扩展变量 案例 解释
:- result=${partt:-word}    如果echo $partt为空,则将word字符串的word这几个字母返回给result,而不是word这个变量的值 。如果partt有值,则返回partt的值。
:= result=${partt:=word}  如果echo $partt为空,则将word变量的值返回给partt和result 。不为空partt返回给result 
:? result=${partt:?word} 如果echo $partt为空,则将word这个字符串的这几个字母word返回给result,如果echo $partt不为空,则后面的word变量当作不存在。
:+ result=${partt:+word}

如果变量pattr值为空,则什么都不做。否则后面的字符返回给接收者。

父子shell

查看进程的命令:

命令1: pstree
─qterminal─┬─zsh───su───zsh───bash───pstree

─lightdm─┬─Xorg───{Xorg}
        │         ├─lightdm─┬─xfce4-session─┬─Thunar───3*[{Thunar}]
        │         │         │               ├─agent───3*[{agent}]
        │         │         │               ├─applet.py
        │         │         │               ├─blueman-applet───4*[{blueman-applet}]
        │         │         │               ├─nm-applet───5*[{nm-applet}]
        │         │         │               ├─polkit-mate-aut───3*[{polkit-mate-aut}]
        │         │         │               ├─xfce4-panel─┬─6*[wrapper-2.0───4*[{wrapper-2.0}]]
        │         │         │               │             ├─wrapper-2.0───3*[{wrapper-2.0}]
        │         │         │               │             └─4*[{xfce4-panel}]
        │         │         │               ├─xfce4-power-man───3*[{xfce4-power-man}]
        │         │         │               ├─xfce4-screensav───3*[{xfce4-screensav}]
        │         │         │               ├─xfdesktop───4*[{xfdesktop}]
        │         │         │               ├─xfsettingsd───4*[{xfsettingsd}]
        │         │         │               ├─xfwm4───9*[{xfwm4}]
        │         │         │               ├─xiccd───3*[{xiccd}]
        │         │         │               └─3*[{xfce4-session}]
        │         │         └─3*[{lightdm}]


命令2:ps -ef
-e:列出所有的进程信息,相当于-A参数。
-f:指定列出uuid ,pid ,ppid等信息。
liangji+    1962       1  0 13:33 ?        00:00:13 /usr/bin/qterminal


命令3:ps -ef forest
liangji+    1962       1  0 13:33 ?        00:00:13 /usr/bin/qterminal
liangji+    1968    1962  0 13:33 pts/0    00:00:00  \_ /usr/bin/zsh
root        2106    1968  0 13:33 pts/0    00:00:00      \_ su root
root        2126    2106  0 13:33 pts/0    00:00:01          \_ zsh
root        6846    2126  0 13:42 pts/0    00:00:00              \_ bash
root       53955    6846  0 15:19 pts/0    00:00:00                  \_ ps -ef --forest

  1. source和点,执行脚本,只在当前的shell环境中执行生效
  2. 指定bash sh解释器运行脚本,是开启subshell,开启子shell运行脚本命令
  3. ./script,都会指定shebang,通过解释器运行,也是开启subshell运 行命令

创建进程列表(创建子shell)

批量执行shell命令

方式1:分号隔开

ls;cd;echo ${lyq};ps -ef;

方式2:进程列表方式,开启子shell运行

(cd ~;pwd;ls ;cd /tmp/;pwd;ls;echo $BASH_SUBSHELL)

一个小括号开启一个子shell运行命令。子shell也可以嵌套执行。

──(root㉿kali)-[/home/liangjian/shell]
└─# (cd ~;pwd;ls;cd /tmp/;pwd;ls;echo $BASH_SUBSHELL)                                                                                                                                  
/root
/tmp
config-err-hv22wE                                                        systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-ModemManager.service-nBMMJn    VMwareDnD
ssh-VoD7Du2uWuov                                                         systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-polkit.service-aaaaaa          vmware-root_659-4013788787
systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-colord.service-wfQgG9   systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-systemd-logind.service-aaaaaa
systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-haveged.service-aaaaaa  systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-upower.service-j8pddj
1   ####返回1表示是在子shell执行的

┌──(root㉿kali)-[/home/liangjian/shell]
└─# cd ~;pwd;ls;cd /tmp/;pwd;ls;echo $BASH_SUBSHELL
/root
/tmp
config-err-hv22wE                                                        systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-ModemManager.service-nBMMJn    VMwareDnD
ssh-VoD7Du2uWuov                                                         systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-polkit.service-aaaaaa          vmware-root_659-4013788787
systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-colord.service-wfQgG9   systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-systemd-logind.service-aaaaaa
systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-haveged.service-aaaaaa  systemd-private-d4919560ef1e4f9f906f17be3c4e3d96-upower.service-j8pddj
0    ####返回0表示是在父shell执行的

子shell的嵌套执行:
例如:(pwd; (pwd; (echo $BASH_SUBSHELL)))

┌──(root㉿kali)-[/tmp]
└─# (pwd;(echo $BASH_SUBSHELL))
/tmp
2

┌──(root㉿kali)-[/tmp]
└─# (pwd; (pwd; (echo $BASH_SUBSHELL)))
/tmp
/tmp
3

利用括号,开启子shel1的理念,以及检查,在shel1脚本开发中,经常会用子shel1进行多进程的处理,提高程序并发执行效率。

 内置命令与外置命令

内置命令和外置命令的区别?

  • 内置命令:在系统启动时就加载入内存,常驻内存,执行效率更高,但是占用资源

  • 外置命令:系统用户需要从硬盘中读取程序文件,再读入内存加载

外置命令即自己单独下载的文件系统命令,处于bash shell之外的程序。

外置命令通常存在于以下目录:
/bin
/usr/bin /sbin
/usr/sbin

可以通过linux的type命令,验证是内置命令还是外置命令。

┌──(root㉿kali)-[/tmp]
└─# type pwd                                                                                                                                                                             
pwd 是 shell 内建

┌──(root㉿kali)-[/tmp]
└─# type cd
cd 是 shell 内建

外置命令一定会开启子进程执行。

liangji+    1962       1  0 14:05 ?        00:00:17 /usr/bin/qterminal
liangji+    1968    1962  0 14:05 pts/0    00:00:00  \_ /usr/bin/zsh
root        2106    1968  0 14:05 pts/0    00:00:00      \_ su root
root        2126    2106  0 14:05 pts/0    00:00:01          \_ zsh
root        6846    2126  0 14:14 pts/0    00:00:00              \_ bash
root       78013    6846  0 16:41 pts/0    00:00:00                  \_ ps -ef --forest

内置命令不会产生子进程去执行,内置命令和shell是一体的,是shell的一部分。系统启动后就执行在内存中的。

查看linux的内置shell命令:
 

┌──(root㉿kali)-[/tmp]
└─# compgen -b
.
:
[
alias
bg
bind
break
builtin
caller
cd
command
compgen
complete
compopt
continue
declare
dirs
disown
echo
enable
eval
exec
exit
export
false
fc
fg
getopts
hash
help
history
jobs
kill
let
local
logout
mapfile
popd
printf
pushd
pwd
read
readarray
readonly
return
set
shift
shopt
source
suspend
test
times
trap
true
type
typeset
ulimit
umask
unalias
unset
wait

三 shell开发初识别

shell多命令执行

└─# date;whoami
2025年 06月 19日 星期四 16:49:13 CST
root

如此多的命令,我们希望用shell编程来表示,简化运维工程。可以将复杂的命令执行过程,通过還辑代码,组成一个脚本文件,再去执行该文件就好了。

常见的shebain:

#!/bin/bash
#!/bin/perl
#!/bin/python

执行脚本的方式:

source my.sh
.my.sh
bash my.sh
./my.sh

示例:写一个date.sh的脚本,输出当前时间。

┌──(root㉿kali)-[/home/liangjian/shell]
└─# cat  date.sh
#! /bin/bash 
echo "现在的时间是:`date`"

                                                                                                                                                                                        
┌──(root㉿kali)-[/home/liangjian/shell]
└─# bash date.sh
现在的时间是:2025年 06月 19日 星期四 17:07:35 CST
                                                                                                                                                                                        
┌──(root㉿kali)-[/home/liangjian/shell]
└─# ./date.sh
zsh: 权限不够: ./date.sh
                                                                                                                                                                                        
┌──(root㉿kali)-[/home/liangjian/shell]
└─# source date.sh
现在的时间是:2025年 06月 19日 星期四 17:08:06 CST

 echo命令,在linux下的格式化打印

┌──(root㉿kali)-[/home/liangjian/shell]
└─# cat echo.sh
#! /bin/bash
echo "now this  time is:"
echo ""    //echo ""表示输出一个空行
//或者:printf "\n\n\n\n" 表示打印4个换行

date
echo "please let's our look logged the system is:"
whoami
                                                                                                                                                                                        
┌──(root㉿kali)-[/home/liangjian/shell]
└─# bash echo.sh
now this  time is:

2025年 06月 19日 星期四 17:17:54 CST
please let's our look logged the system is:
root

写一个脚本,输出当前用的用户名,uid及所在目录:
【echo能够输出变量的值】

┌──(root㉿kali)-[/home/liangjian/shell]
└─# cat echo.user-informationes.sh 
#! /bin/bash
#! /bin/perl
#! /bin/python

#这段代码是需要输出当前目录下的用户名称,对应的uid及用户所在的目录。
echo "The username is:${USER}"
#或者写成 echo "The username is:" ${USER}
echo "user UID is:"${UID}
echo "the user dir is:"$HOME
printf "您好,恭喜您成功获取到拉!"
                                                                                                                                                                                        
┌──(root㉿kali)-[/home/liangjian/shell]
└─# bash echo.user-informationes.sh
The username is:liangjian
user UID is:0
the user dir is:/root
您好,恭喜您成功获取到拉!                    

echo和转义符的概念

  • 所谓转义符就是还原符号原本的意思,不会被 阅读为特殊含义。
常见的2个转义符号:
1、💲符号:“$”
2、单引号:''  
说明:”“是弱引用,把特殊符号,比如:$当作特殊字符处理,会被进行转义。
    ‘’ 是强引用,把特殊符号当作普通字符串处理,不会进行转义。

比如:

┌──(root㉿kali)-[/home/liangjian/shell]
└─# cat smart.price.sh 
#! /bin/bash
#! /bin/perl
#! /bin/python

#该代码旨在说明“”和‘’的弱引用(识别特殊字符)和强引用(不识别特殊字符),以$符号为例:

echo "my iphone 16 promax of price is:$999"
echo "my iphone 16 promax of price is:\$999"
echo "my iphone 16 promax of price is:" $999
echo 'my iphone 16 promax of price is:$999'
echo 'my iphnoe 16 promax of price is:''$999'
                                                                                                                                                                                        
┌──(root㉿kali)-[/home/liangjian/shell]
└─# bash smart.price.sh
my iphone 16 promax of price is:99
my iphone 16 promax of price is:$999
my iphone 16 promax of price is: 99
my iphone 16 promax of price is:$999
my iphnoe 16 promax of price is:$999




echo "my iphone 16 promax of price is:" '$999'
-------》
my iphone 16 promax of price is: $999


变量在脚本中的使用

变量被引用的时候,会被赋予其值,脚本中的变量,会在shell执行结束后消失,具体根据执行的方式决定。

变量值的获取方式为:$变量

  • 当你用不同的方式,执行脚本,产生的后果也不一样source和.是在当前的shell环境中加载变量,执行脚本。
  • bash或sh 去执行脚本的时候,是开启子shell运行的,变量也是在子shell环境中放载,子shell退出后,变量也就消失了
┌──(root㉿kali)-[/home/liangjian/shell]
└─# cat variable.sh   
#!/bin/bash
#!/bin/perl
#!/bin/python

# 变量被引用的时候,会被赋予其值,脚本中的变量,会在shell执行结束后消失,具体根据执行的方式决定。

name="liangjian"
age="18"

echo "到2025年为止,$name已经$age岁了!"

##采用bash或sh的时候,创建子shell执行,执行结束后子进程消失,变量的值也会消失。
                                                                                                                                                                                        
┌──(root㉿kali)-[/home/liangjian/shell]
└─# bash variable.sh   
到2025年为止,liangjian已经18岁了!
                                                                                                                                                                                        
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo $name; echo$age 

## 采用source或. 的时候,在当前环境执行,变量的值不会丢失。

┌──(root㉿kali)-[/home/liangjian/shell]
└─# source variable.sh         
到2025年为止liangjian已经18岁了
                                                                                                                                                                                        
┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo $name;echo $age
liangjian
18

                                                                                                                                                                                      

 linux中shell变量的替换引用

shell的一大特性,就是可以从命令的执行结果中,再提取结果,因此特别适合编写脚本

  • 💲符号:$()
  • 反引号:``

linux特殊符号总结

${vars}

取出变量结果

$()

再括号中执行命令,且拿到命令的执行结果

``

再括号中执行命令,且拿到命令的执行结果

()

开启子shell执行命令结果

$vars

取出变量结果

┌──(root㉿kali)-[/home/liangjian/shell]
└─# date
2025年 06月 20日 星期五 16:43:50 CST

┌──(root㉿kali)-[/home/liangjian/shell]
└─# $(date)
2025年:未找到命令

┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo "现在的时间是:$(date)"
现在的时间是:2025年 06月 20日 星期五 16:44:42 CST


┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo "当前的登录用户是:`whoami`"
当前的登录用户是:root



┌──(root㉿kali)-[/home/liangjian/shell]
└─# (pwd;ls;echo $BASH_SUBSHELL;whoami)
/home/liangjian/shell
date.sh  echo  echo.sh  echo.user-informationes.sh  smart.price.sh  variable.sh
1
root

 
四 shell开发

数值计算命令

双小括号(())

 特殊符号运算


┌──(root㉿kali)-[/home/liangjian/shell]
└─# a=5

┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo $((++a))
6

┌──(root㉿kali)-[/home/liangjian/shell]
└─# b=5

┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo $((b++))        #先echo出b的值,再对b进行加1操作。
5

┌──(root㉿kali)-[/home/liangjian/shell]
└─# echo $b
6

对用户的输入进行判断的脚本开发

思路:

  • 脚本的功能、作用、需求
  • 转化为shell脚本代码

开发一个接收用户输入的数字,并且对运算符号进行判断,最终给出计算结果。

  • 接收用户输入
  • 判断用户输入是不是数字
  • 对输入的运算符进行计算
  • 输出运算结果

 

[root@chaogelinux
#!/bin/bash
shell_program]#
cat
Calculation. sh
#脚本开发
#函数的作用,就是把你写的功能代码,进行打包,封装成一个函数名,然后调用该函数名,函数就会执行##函效体中的代码就会执行
#函数的名字
# 这个函数作用是,告诉用户,你到底应该输入什么的一个简单提示函数而已
print_usageoi
printf "Please enter an integer!!!\n"
#给脚本的执行结果,赋予一个状态码,退出码
#接受用户输入的命令,-p参数后面写,给用户看到的提示信息
# read -p “提示信息”接受用户输入的变量
read -p "Please input your number: "
# 进行对用户输入判断 if 语句# 注意语法格式!!
#限制用户必须输入纯数字
#中括号里面前后必须有一个空格,是固定的语法
#-n 参数是if的语句,对字符串判断,如果字符串为空,条件就不成立,如果字符串不为空,条件成立
# qwe123
# sed的作用就是把上述字符串“qwe123” 进行替换,我把所有的数字都替换为空,那么就剩下其他非数字的内容了
# 如果用户输入的是纯数字,123456
if C-n "echo $firstnumlsed 's/[0-9]//g'"]
then
print_usage
fi
#上面的代码都是对用户输入进行判断,
# 希望用户输入3+5
#此时对运算符进行输入
read -p "Please input your operator:" operator
#对运算符进行判断
##限制在+-*/四个符号

if [ "${operator}" != "+" ] && [ "${operator}" != "-" ] && [ "${operator}" != "*" ] && [ "${operator)" != "/" ]
then
echo"只允许输入 +I-1*1/"
exit 2
fi
# 对第二个变量进行处理
read -p "Please input second number:" secondnum if [-n "echo Ssecondnum|sed 's/[0-9]//g'*" ]
then
print_usage
fi
##最后进行数值计算,利用双小括号计算
echo "${firstnum}$(operator}${secondnum} R R: SC(S{firstnum}S{operator}S{secondnum}))"