shell脚本编程的例子(50例子)-1

前言

为了提高教学质量,并且能够让童鞋们更好的理解和运用shell脚本以及相关编程,特编写了50个shell例子,目前还在整理过程ing,计划分三期完成。请有需要的同学收藏。后续会申请VIP阅读。……

^.^  …… ^…^

实验环境:

WSL2 for unbuntu2204 

编辑器:vi 

shell环境:ubuntu2204默认的bash

一、shell执行方式:

第一种:PATH 环境变量的默认值不包含当前目录,

若脚本文件在当前目录,应使用 ./script-file

使用文本编辑器编辑好, 为脚本文件添加可执行权限

chmod +x script-file

./script-file

第二种:PATH 环境变量的默认值包含 ~/bin 目录,

用户可以将自己的脚本文件存放在 ~/bin 目录,

之后即可直接调用脚本文件名执行脚本了

Shell中执行

bash script-file

script-file

当前Shell中执行

source script-file

.  script-file

注意调用bash和sh区别:

  • bash:Bourne Again SHell (bash) 是 Bourne shell (sh) 的一个替代品。它最初是为替代原始的 Bourne shell而设计的,并提供了更多的功能和改进。bash 是 GNU 项目的一部分,并且是许多系统上的默认 shell。
  • sh:sh 是 Bourne shell 的原始版本,它是 UNIX 系统上最早的 shell 解释器之一。尽管许多现代系统仍然支持 sh,但它的功能相对有限,与 bash 和其他现代 shell(如 zsh、ksh)相比,缺少许多高级特性。

常用调试法:

Bash [-x] [-n] [-v] scriptName

-x 让用户跟踪脚本的执行,此时 shell 对脚本中每条命令的处理过程为:先执行替换,然后显示,再执行它。shell 显示脚本中的行时,会在行首添加一个加号 “ + ”。

-n 对脚本进行语法检查,但不执行;若存在语法错误提示。

-v 在执行脚本之前,按输入的原样打印脚本中的各行。

使用bash内置命令set使整个或部分脚本处于调试模式:

开启:set  [-x] [-n] [-v]

结束:set  [+x] [+n] [+v]

二、命令执行过程:

  • 将命令行分成单个命令词
  • 展开别名
  • 展开大括号中的声明({}
  • 展开颚化声明(~
  • 命令替换 ( $()``
  • 再次把命令行分成命令词
  • 展开文件通配(*、?[abc]等等)
  • 准备I/0重定向(<>
  • 运行命令!

三、具体实例:

一些符号解释:省略,请童鞋门自己备注或者笔记!!

Eg1,read的使用

#!/bin/bash

# This script is to test the usage of read

# Scriptname: ex4read.sh

echo "=== examples for testing read ==="

echo -e "What is your name? \c"

read name

echo "Hello $name"

echo

echo -n "Where do you work? "

read

echo "I guess $REPLY keeps you busy!"

echo

read -p "Enter your job title: "

echo "I thought you might be an $REPLY."

echo

echo "=== End of the script ==="

Bash [-x] ex4read.sh

Eg2.if分支语句的使用

linux@LAPTOP-X280:~$ cat if.sh

#!/bin/bash

## filename: areyouok.sh

#set -x ### Turn ON debug mode ###

echo

echo -e "Hello $LOGNAME, \c"

echo    "it's nice talking to you."

echo -n "Your present working directory is: "

pwd # Show the name of present directory

echo

#set +x ### Turn OFF debug mode ###

echo -e "The time is `date +%T`!. \nBye"

echo

echo "---1st demo about if-YorN---"

echo "Are you OK ?"

read answer

# 在 if 的条件判断部分使用扩展的 test 语句 [[...]]

# 在 [[]] 中可以使用shell的通配符进行条件匹配

if  [[ $answer==[Yy]* || $answer==[Mm]aybe ]]

then  echo "Glad to hear it."

fi

echo

echo "---2ed demo about if-UPorDown---"

# if 的条件部分可以使用普通的命令进行测试

# 当命令正确执行($?=0)返回真,否则($?<>0)返回假

myhost=peggy0223

if ping -c1 -w2 $myhost &>/dev/null

then

  echo "$myhost is UP."

else

  echo "$myhost is DOWN."

fi

echo

echo "---3rd demo about if-IDcheck---"

## filename:  idcheck.sh

# purpose: check user id to see if user is root.

# Only root has a uid of 0.

# Format for id output:

#   uid=9496(ellie) gid=40 groups=40

#   root's uid=0

#

id=`id | awk -F'[=(]'  '{print $2}'`   # get user ID

echo "your user id is: $id"

if  (( id == 0 ))    # [ $id -eq 0 ]

then

  echo "you are superuser."

else

  echo "you are not superuser."

fi

echo

Eg3.分支语句ifelse的使用

#!/bin/bash

## filename: decide_file_type.sh

# if 语句可以嵌套使用

##实现判断文件类型,如是普通文件查看具有什么权限

if [ $# -ne 1 ] && echo "Usage: $0 <filename>" ; then

        exit 1

fi

file=$1

#set -x

# Check if the file exists

if [ ! -e "$file" ]; then

  echo "$file does not exist."

  exit 1

fi

if [ -d $file ];then

        echo "$file is a directory"

elif [ -f $file ];then

        #if [ -r $file -a -w $file -a -x $file ] ; then

        #if [[ -r $file && -w $file && -x $file ]] ; then

        #       echo "You have (rwx) permissioon on $file."

        #fi

        # Check file permissions separately

        read_perm=$(stat -c "%A %u %g" "$file" | cut -c 2)

        write_perm=$(stat -c "%A %u %g" "$file" | cut -c 3)

        exec_perm=$(stat -c "%A %u %g" "$file" | cut -c 4)

        if [ "$read_perm" = "r" ]; then

          echo "this file Read permission: yes"

        else

          echo "this file Read permission: no"

        fi

        if [ "$write_perm" = "w" ]; then

          echo "this file Write permission: yes"

        else

          echo "this file Write permission: no"

        fi

        if [ "$exec_perm" = "x" ]; then

          echo "this file Execute permission: yes"

        else

          echo "this file Execute permission: no"

        fi

else

        echo "$file is neither a file nor a directory."

fi

Eg4,实现小于12的阶乘:

执行结果:

code:

#!/bin/sh -

set -x

if test $# -eq 0

then

        echo "Missing arguments"

else if test $1 -gt 12

then

        echo "arument too big!"

        exit

#set +x

else

#set -x

        i=$1

        j=1

        while test $i -ne 0

        do

                j=`expr $j \* $i`

                i=`expr $i - 1`

        done

        echo $j

#set +x

        fi

fi

Eg5shell变量的综合应用实例

code

注意:

变量=赋值,空格的使用;

“”、‘’和`` 的区别使用;

注意wins下编辑复制到linux下的vi需要set ff=unix回车

建议set -x开启debug模式。

#!/bin/sh -

#This script for variables in shell

set -x

wow="hi,boy"

ygu='YGU-dx1a'

clear

echo "$wow ,My name is beautiful girl from $ygu"

echo Home Directory: $HOME

echo command line here is:

echo $0 $*

echo Before shift operation

echo No. of arguments = $#

echo All the arguments: $*

echo \$0 = $0, \$1 = $1, \$2 = $2

shift

echo After one shift operation

echo No. of arguments: $#

echo All the arguments: $*

echo \$0 = $0, \$1 = $1, \$2 = $2

执行结果如下:1 3 5 7 9

执行另一个结果如下:1 a 3 b 5 c 7 d 9 e

Eg6、编写一个程序判断/bin目录下的date文件是否存在

code:

set -x

fname=/bin/date

if (test -f "$fname")then

        echo "exit"

fi

执行结果:

Eg7、检查id的脚本

#!/bin/bash

## filename:  idcheck.sh

# purpose: check user id to see if user is root.

# Only root has a uid of 0.

# Format for id output:

#   uid=9496(ellie) gid=40 groups=40

#   root's uid=0

#  使用bash执行正常,./执行也ok,sh执行出错!

id=`id | awk -F'[=(]'  '{print $2}'`   # get user ID

echo "your user id is: $id"

if  (( id == 0 ))    # [ $id -eq 0 ]

then

  echo "you are superuser."

else

  echo "you are not superuser."

fi

Eg8、if语句-测试询问年龄

#!/bin/bash

## filename: ask-age.sh

read  -p "How old are you?  "  age

# 使用 Shell算术运算符(())进行条件测试

if ((age<0||age>120)); then

    echo "Out of range !"

    exit 1

fi

# 使用多分支if语句

if   ((age>=0&&age<13)) ; then   echo "Child !"

elif ((age>=13&&age<20)); then   echo "Callan !"

elif ((age>=20&&age<30)); then   echo "P III !"

elif ((age>=30&&age<40)); then   echo "P IV !"

else   echo "Sorry I asked."

fi

Eg9、if语句-useronline

#!/bin/bash

## filename: useronline.sh

# bash 138-if.sh root / linux查看效果

# if 语句可以嵌套使用

if [ $# -eq 1 ] # 或 [[ $#==1 ]] 或(($#==1))

then

  if who|grep $1 >/dev/null

  then echo $1 is active.

  else echo $1 is not active.

  fi

else

  echo "Usage: $0 <username>"

  exit 1

fi

Eg10、case语句-what-lang-doulike?

#!/bin/bash

## filename: what-lang-do-you-like.sh

echo "What is your preferred scripting language?"

echo "1) bash"

echo "2) perl"

echo "3) python"

echo "4) ruby"

echo "5) I do not know !"

read lang

case $lang in

    1) echo "You selected bash"  ;;

    2) echo "You selected perl"  ;;

    3) echo "You selected python";;

    4) echo "You selected ruby"  ;;

    5) exit

esac

Eg11、case语句-yeorno?

#!/bin/bash

## filename: yesorno.sh

echo -n "Do you agree with this? [yes or no]: "

read yn

case $yn in

  [Yy] | [Yy][Ee][Ss] ) echo "Agreed."  ;;

  [Nn] | [N|n][O|o]   )

                        echo "Not agreed."

                        exit 1

                        ;;

   *)                   echo "Invalid input." ;;

esac

Eg12、case语句-“一键备份”

#!/bin/bash

## filename: all_in_one_backup.sh

# A shell script to backup mysql, webserver and files.

# opt=$1

case $1 in

   sql) echo "Running mysql backup using mysqldump tool..." ;;

  sync) echo "Running backup using rsync tool..."           ;;

   git) echo "Running backup using gistore tool..."         ;;

   tar) echo "Running tape backup using tar tool..."        ;;

     *)

        echo "Backup shell script utility"

        echo "Usage: $0 {sql|sync|git|tar}"

        echo "  sql  : Run mySQL backup utility."

        echo "  sync : Run web server backup utility."

        echo "  git  : Run gistore backup utility."

        echo "  tar  : Run tape backup utility."

        ;;

esac

Eg13、foreach语句-使用字面字符串列表作为 WordList

#!/bin/bash

## filename: for1--constant_as_list.sh

# 使用字面字符串列表作为 WordList

for x in centos ubuntu gentoo opensuse

do   echo "$x" ; done

# 若列表项中包含空格必需使用引号括起来

for x in Linux "Gnu Hurd" FreeBSD "Mac OS X"

do  echo "$x" ; done

for x in ls "df -h" "du -sh"

do

    echo "==$x==" ; eval $x

done

Eg14、foreach语句-使用变量作为 WordList

#!/bin/bash

## filename: for2--variable_as_list.sh

# 使用变量作为 WordList

i=1; weekdays="Mon Tue Wed Thu Fri"

for day in $weekdays ; do

  echo "Weekday $((i++)) : $day"

done

OSList="Linux ‘Gnu Hurd’ FreeBSD ‘Mac OS X’"

for x in $OSList Others ; do

  echo "$x"

done

Eg15、foreach语句-使用位置参数变量 $@ 作为 WordList

in $@ 可以省略作为 WordList

#!/bin/bash

## filename: for3--pp_as_list.sh

# 使用位置参数变量 $@ 作为 WordList, in $@ 可以省略

#执行:bash 152-foreach.sh Mon Tue wed Thu Fri sat Sun lundi

i=1

for day ; do

  echo -n "Positional parameter $((i++)): $day "

  case $day in

    [Mm]on|[Tt]ue|[Ww]ed|[Tt]hu|[Ff]ri)

       echo " (weekday)" ;;

    [Ss]at|[Ss]un)

       echo " (WEEKEND)" ;;

    *) echo " (Invalid weekday)" ;;

  esac

done

Eg16、foreach语句-使用文件名或目录名列表作为 WordList

#!/bin/bash

## filename: for4--filenames_as_list.sh

# 使用文件名或目录名列表作为 WordList

# 将当前目录下的所有的大写文件名改为小写文件名

for filename in * ; do

  # 使用命令替换生成小写的文件名,赋予新的变量 fn

  fn=$(echo $fname | tr A-Z a-z)

  # 若新生成的小写文件名与原文件名不同,改为小写的文件名

  if [[ $fname != $fn ]] ; then mv $fname $fn ; fi

  # 上面的 if 语句与下面的命令聚合均等效

  # [[ $fname != $fn ]] && mv $fname $fn

  # [[ $fname == $fn ]] || mv $fname $fn

done

for fn in /etc/[abcd]*.conf ; do echo $fn ; done

for fn in /etc/cron.{*ly,d}/* ; do echo $fn ; done

for i in *.zip; do

  j="${i%.zip}"; mkdir "$j" && unzip -d "$j" "$i"

done

 

Eg17、foreach语句-使用命令的执行结果作为 WordList

#!/bin/bash

## filename: for5--command_output_as_list.sh

# 使用命令的执行结果作为 WordList

i=1

for username in `awk -F: '{print $1}' /etc/passwd`

do

    echo "Username $((i++)) : $username"

done

for line in $(cat files.txt|egrep -v "^$|^#") ; do

    echo "$line"; done

for suffix in $(seq 254)

do echo "192.168.0.${suffix}"; done

for f in $( ls /var/ ); do echo $f; done

Eg18、foreach语句-使用数值范围作为  WordList

#!/bin/bash

## filename: for6--range-of-numbers_as_list.sh

# 使用数值范围作为 WordList

mynet="192.168.0"

for num in {1..254}

do

  echo "IPAdress $num: $mynet.$num"

done

# 使用包含步长(increment)的数值范围作为 WordList

for num in {1..10..2}

do

  echo "Number: $num"

done

Eg19、foreach-扫描ip检测keysanformIPS-up-or-down

请谨慎操作,或者修改ip地址范围

#!/bin/bash

## filename: for--ssh-keyscan_from_ips.sh

# for 语句可嵌套

for i in 0 1 2 ; do

  for suffix in {1..254} ; do

    ip=192.168.$i.${suffix}

    if  ping -c1 -w2  $ip &>/dev/null

    then

       ssh-keyscan -t rsa,dsa  $ip \

           >> ~/.ssh/known_hosts

    else

        echo "Host ($ip) is DOWN."

    fi

  done

done

Eg20、批量添加50个user

请谨慎操作:

#!/bin/bash

## filename: addusers_foreach.sh

# 成批添加50个用户

for x in {1..50}      # 或 $(seq 50)

do

    useradd user${x}

    echo "centos"|passwd --stdin user${x}

    chage -d 0  user${x}

done

--------------------------------------------------------------分隔符------------------------------------------------------------

21-40个例子后续补充!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/560222.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javaWeb项目-智慧餐厅点餐管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JavaScript Java…

C语言进阶课程学习记录-内存操作经典问题分析

C语言进阶课程学习记录-内存操作经典问题分析 实验-示例1优化 实验-示例2优化 实验-示例3实验-示例4小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-示例1 #include <stdio.h> #include…

ChatGPT研究论文提示词集合1-【主题选择与问题研究、文献综述】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.主题选择与问题定义 2.文献综述 3.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程&#xff0c;精心准备一套学术研究各个流程的提示词集合。总共14个步骤…

HTTP请求中的cookie与session(servlet实现登录页面的表单验证)

一、cookie 与 session 1&#xff09;cookie 与 session 的定义 2&#xff09;相关的servlet中的 方法 二、代码实现 登录页面 1&#xff09;先用 vscode 编写登录页面 注意文件的路径 在webapp路径下 <!DOCTYPE html> <html lang"en"><head>&…

ai写作强大,ai写作哪个软件最好用?

在当今数字化时代&#xff0c;ai技术的发展正以惊人的速度改变着我们的生活和工作方式。其中&#xff0c;ai写作作为一项令人瞩目的创新&#xff0c;展示了强大的文本生成能力。然而&#xff0c;随着各种ai写作软件的涌现&#xff0c;人们不禁困惑&#xff1a;哪个软件才是最好…

【网络设备巡检命令】--思科、华为、H3C、锐捷

【网络设备巡检命令】--思科、华为、H3C、锐捷 一、思科二、华为三、H3C四、锐捷 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 一、思科 1、查看系统信息&#xff1a; show version2、查看时间&#xff1a; show clock3、查看序列号&a…

Zed 捕获图像+测距

Zed 捕获图像测距 1. 导入相关库2. 相机初始化设置3. 获取中心点深度数据4. 计算中心点深度值5. 完整代码5. 实验效果 此代码基于官方代码基础上进行改写&#xff0c;主要是获取zed相机深度画面中心点的深度值&#xff0c;为yolo测距打基础。 1. 导入相关库 import pyzed.sl …

C语言 ─── 操作符详解

目录 1. 算术操作符 2. 移位操作符 2.1 左移操作符 2.2 右移操作符 3. 位操作符 4. 复合赋值符 5. 单目操作符 6. 逗号表达式 7. 隐式类型转换 7.1 整型提升的意义&#xff1a; 7.2 如何进行整体提升呢&#xff1f; 8. 算术转换 ★★★数组名 1. 算术操作符 -…

redis与etcd的对比

1.redis是一种高级的key&#xff1a;value存储系统&#xff0c;其中value支持五种数据类型&#xff1a; 1.1 字符串&#xff08;strings&#xff09; 1.2 字符串列表&#xff08;lists&#xff09; 1.3 字符串集合&#xff08;sets&#xff09; 1.4 有序字符串集合&#xff08;…

管理 nodejs 版本工具 nvm

nvm 方便切换不同版本的 node 及 对应的 npm 版本 一、安装nvm nvm官网 &#xff08;内含下载的文件&#xff0c;点击进去下载&#xff0c;并按照 网站文档步骤 操作即可&#xff09; 二、nvm 基础命令 nvm arch&#xff1a;显示node是运行在32位还是64位。nvm install <…

centos修改启动项加载不同内核

一.背景&#xff1a; 虚拟机中有时需要编译好几个内核版本&#xff0c;make install后系统存在几个内核版本。需要再哪个内核上开发调试就启动特定的内核版本。这就需要修改启动时的内核版本&#xff0c;再物理机或虚拟机启动时可以上下键选择。但有时是docket云环境中或远程时…

CANoe中LIN工程主节点的配置(如何切换调度表)

1&#xff1a;前置条件 1&#xff09;工程已经建立&#xff0c;simulation窗口已经配置好&#xff08;包括且不限于通道mappin好&#xff0c;数据库文件已经添加&#xff09; 2&#xff09;我已系统自带sampleCfg工程&#xff0c;作为例子。如下图 2 &#xff1a;主节点的配置…

前端css中table表格的属性使用

前端css中table表格的属性使用 一、前言二、常见的表格属性1.边框的样式2.布局和对齐3.间距和填充4.背景和颜色5.字体的样式6.边框的圆角 三、简单的表格&#xff0c;例子11.源码12.源码1效果截图 四、给表格添加动画效果&#xff0c;例子21.源码22.源码2的运行效果 五、结语六…

【热门话题】探索与心得:深入体验Microsoft Edge浏览器

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 探索与心得&#xff1a;深入体验Microsoft Edge浏览器一、Edge浏览器概述1.1 发…

通快霍廷格TruPlasma MF中频电源培训PPT课件内容下图

通快霍廷格TruPlasma MF中频电源培训PPT课件内容下图

美业连锁门店收银系统源码-如何查看收款门店对应的加盟商?

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 第一步&#xff1a; 登录pc管理后端 第二步&#xff1a; 进入企业组织管理-门店管理&a…

【Linux】认识文件(一):文件标识符

【Linux】认识文件&#xff08;一&#xff09;&#xff1a;文件标识符 一.什么是文件&#xff1f;1.文件的本质2.文件的分类 二.访问文件操作1.C语言中的访问文件接口i.fopenii.fcloseiii.fwrite 2.系统访问文件接口i.openii.closeiii.write 三.文件管理1.对所有打开文件的管理…

Linux入门学习 之 基础操作指令讲解(小白必看)

股票的规律找到了&#xff0c;不是涨就是跌 一、Linux下基本指令 1.ls 指令 2.pwd 命令 3.cd 指令 4.touch 指令 5.mkdir 指令 6.rmdir指令 && rm 指令 7.man 指令 8.cp 指令 9.mv指令 10.cat 11.more 指令 12.less 指令 13.head 指令 14.tail 指令 15…

SQLite作为应用程序文件格式(二十八)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite数据库中JSON 函数和运算符(二十七) 下一篇&#xff1a;SQLite—系列文章目录 摘要 具有定义架构的 SQLite 数据库文件 通常是一种出色的应用程序文件格式。 以下是十几个原因&#xff1a; 简化的应用程序开发单文…

BUUCTF-MISC01金胖

题目&#xff1a;动图使用Stegsolve软件进行逐帧查看 下载文件后&#xff0c;图片隐写之gif多帧隐藏&#xff0c;这类题比较简单&#xff0c;只需要将图片使用Stegsolve软件进行逐帧查看就行了.file-open打开添加文件 将文件添加进来&#xff0c;而后点击Analyse-Frame Browse…