系统管理中 bash shell 脚本常用方法总结

1、Linux 命令行与 shell 脚本编程入门 本文全面介绍了Linux命令行与shell脚本编程的基础知识和进阶技巧,涵盖Linux系统组成、发行版分类、shell访问方式、基础与高级命令操作、环境变量设置、文件权限管理、常用文本编辑器使用方法,以及shell脚本的构建、结构化命令、用户输入处理、数据重定向、日志记录、脚本控制与调度等内容。适合系统管理员、Linux爱好者及开发者学习参考,帮助读者掌握Linux环境下自动化任务处理的核心技能。 阅读详情

在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!
在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则.

1. 单引号和双引号的区别

单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是 普通字符 ,不会作变量的引用,直接输出字符窜。请看如下例子:

  [root@linux ~]# name=HaHa
  [root@linux ~]# echo $name
  HaHa
  [root@linux ~]# myname="$name is wow"
  [root@linux ~]# echo $myname
  HaHa is wow
  [root@linux ~]# myname='$name is wow'
  [root@linux ~]# echo $myname
  $name is wow

从上面例子可以看出,使用了单引号的时候,那么$name只是普通字符,直接输出而已!

2. 逐行读取文件

  • 使用for循环来读取文件
      for line in `cat file.txt`
      do
      	echo $line
      done

注意:由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,如果行里有空格的时候,输出的结果会很乱,所以只适用于行连续不能有空格或者换行符的文件

  • 使用while循环读取文件
      cat file.txt |while read line
      do
      	echo $line
      done
    
      或者:
    
      while read line
      do
      	echo $line
      done < file.txt

注意:由于使用while来读入文件里的行时,会整行读入,不会关注行的内容(空格..),所以比for读文件有更好的适用性,推荐使用while循环读取文件

3. bash shell 脚本中常用隐含变量

$0当前执行的脚本或者命令名称
$1-$9代表参数的位置. 举例 $1 代表第一个参数.
$#脚本调用的参数的个数
$@所有参数的内容
$*所有参数的内容
$$当前运行脚本的进程号
$?命令执行后返回的状态
$!后台运行的最后一个进程号

注意: $? 用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)
$$ 变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。
$* 和 $@ 如果输出是一样的,但是在使用for循环,在使用 双引号(”")引用时 “$*” 会输出成一个元素 而 “$@” 会按照每个参数是一个元素方式输出

请看测试例子

  #cat test.sh
  #!/bin/sh
  echo '"$@" output.....'
  for i in "$@"
  do
  	echo $i
  done
  echo '"$*" output ....'
  for i in "$*"
  do
  	    echo $i
  done

输出结果

  #sh test.sh a b c d
  "$@" output.....
  a
  b
  c
  d
  "$*" output ....
  a b c d

从输出结果可以看出 “$*” 输出是一行 而 “$@” 输出则是四行

4. 变量内容的删除与替换

我们在一些情况下,需要对变量中的字符窜进行查找删除或者替换,就需要使用下表列出的方法

变量设定方式说明
${变量#关键字}若变量内容从头开始的资料符合‘关键字’,则将符合的最短资料删除
${变量##关键字}若变量内容从头开始的资料符合‘关键字’,则将符合的最长资料删除
${变量%关键字}若变量内容从尾向前的资料符合‘关键字’,则将符合的最短资料删除
${变量%%关键字}若变量内容从尾向前的资料符合‘关键字’,则将符合的最长资料删除
${变量/旧字串/新字串}若变量内容符合‘旧字串’则‘第一个旧字串会被新字串取代
${变量//旧字串/新字串}若变量内容符合‘旧字串’则‘全部的旧字串会被新字串取代

举例如下(删除字符窜中的某个字符):

  [root@linux ~]# export test_str="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
  [root@linux ~]# echo ${test_str#/*kerberos/bin:}
  /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

5. 变量条件测试赋值

在某些时刻我们需要‘判断’某个变量是否存在,若变量存在则将此变量值赋值给新的变量,若变量不存在则将其他值赋值给新的变量.

变量设定方式str 未定义str 为空字串str 已赋值为非空字串
var=${str-expr}var=exprvar=var=$str
var=${str:-expr}var=exprvar=exprvar=$str
var=${str+expr}var=var=exprvar=expr
var=${str:+expr}var=var=var=expr
var=${str?expr}expr 输出至 stderrvar=var=$str
var=${str:?expr}expr 输出至 stderrexpr 输出至 stderrvar=$str
var=${str=expr}var=exprvar=var=$str
var=${str:=expr}var=exprvar=exprvar=$str

举例如下:

  [root@linux ~]# test_name=""
  [root@linux ~]# test_name=${test_name-root}
  [root@linux ~]# echo $test_name
        <== 因为 test_name 被设定为空字符窜!所以当然还是保留为空字符窜!
  [root@linux ~]# test_name=${test_name:-root}
  [root@linux ~]# echo $test_name
  root  <== 加上‘:’后若变量内容为空或者是未设定,都能够以后面的内容替换!

基本上这种变量的测试也能够透过 shell script 内的 if…then… 来处理,不过通过上述提及的简单的方法来测试变量,是程序看起来更精简一些!

6. shell 中分隔符 : 变量IFS 使用

shell脚本中,如果使用for循环一个字符窜的话,默认使用空格来分割字符窜. 还有前面所提到的  使用for循环逐行读取文件内容时候,文件行中如果有空格的话输出的结果也会变乱. 这个时候 使用 IFS 变量来设置特定的字符窜分割符来,达到输出正确的目的. 默认情况下 IFS 是使用 <space><tab><newline>, 空格 \t \n 来作为默认的分割符的.

我们将前面使用for逐行读取文件的例子 改进下就可以输出正确了,请看下面

  #!/bin/bash
  IFS_old=$IFS      #将原IFS值保存,以便用完后恢复
  IFS=$’\n’         #更改IFS值为$’\n’
  for line in `cat file.txt`
  do
  	echo $line
  done

file.txt 文件内容如下

  [root@linux]$ cat file.txt
  sdfsdfsdfsdf
  ssssss ssssss ssssss sssss
  sdfsdfsdfsdfsdf

执行测试程序 输出结果如下(正确输出)

  [root@linux]$ sh test.sh
  sdfsdfsdfsdf
  ssssss ssssss ssssss sssss
  sdfsdfsdfsdfsdf

如果未设置IFS变量,使用默认的IFS变量值 ,输出结果如下

  [root@linux]$ sh test.sh
  sdfsdfsdfsdf
  ssssss
  ssssss
  ssssss
  sssss
  sdfsdfsdfsdfsdf

从以上测试程序输出结果,可以根据自己的需求来设定 IFS变量,在举一个例子如下:

  while IFS=: read userName passWord userID groupID geCos homeDir userShell
  do
        echo "$userName -> $homeDir"
  done < /etc/passwd

7. shell 数组的使用

数组赋值方式:

  (1) array=(var1 var2 var3 ... varN)
  (2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
  (3) array[0]=var1
      arrya[1]=var2
      ...
      array[n]=varN

计算数组元素个数或者长度:

  (1) ${#array[@]}
  (2) ${#array[*]}

了解了数组基础语法,举例说明,请看:

  #!/bin/bash
  NAMESERVERS=("ns1.www.net." "ns2.www.net." "ns3.www.net.")
  # 得到数组长度
  tLen=${#NAMESERVERS[@]}

  # 循环数组
  for (( i=0; i<${tLen}; i++ ));
  do
    echo ${NAMESERVERS[$i]}
  done

在看一个复杂一点的例子,将文件内容读取到数组中:

  #!/bin/bash

  # 设置IFS将分割符 设置为 换行符(\n)
  OLDIFS=$IFS
  IFS=$'\n' 

  # 读取文件内容到数组
  fileArray=($(cat file.txt))

  # restore it
  IFS=$OLDIFS
  tLen=${#fileArray[@]}

  # 循环显示文件内容
  for (( i=0; i<${tLen}; i++ ));
  do
    echo "${fileArray[$i]}"
  done

8. 逻辑判断 条件测试

  • 文件属性的判断
操作符测试结果
-e filename文件存在返回1, 否则返回0
-r filename文件可读返回1,否则返回0
-w filename文件可写返回1,否则返回0
-x filename文件可执行返回1,否则返回0
-o filename文件属于用户本人返回1, 否则返回0
-z filename文件长度为0返回1, 否则返回0
-f filename文件为普通文件返回1, 否则返回0
-d filename文件为目录文件时返回1, 否则返回0

举例如下,测试文件是否存在:

  #!/bin/bash
  echo "checks the existence of the messages file."
  echo -n "Checking..."
  if [ -f /var/log/messages ];then
      echo "/var/log/messages exists."
  fi
  echo
  echo "...done."
  • 字符串比较
操作符比较结果
str1 = str2当两个字串相等时为真
str1 != str2当两个字串不等时为真
-n str1当字符串的长度大于0时为真
-z str1当字符串的长度为0时为真
str当字符串为非空时为真

举例如下,比较字符串来测试用户ID :

  if [ "$(whoami)" != 'root' ]; then
          echo "You have no permission to run $0 as non-root user."
          exit 1;
  fi
  • 数值比较(整数)
操作符比较结果
num1 -eq num2两数相等为真
num1 -ne num2两数不等为真
num1 -gt num2num1大于num2为真
num1 -ge num2num1大于等于num2为真
num1 -lt num2num1小于num2为真
num1 -le num2num1小于等于num2为真

举例如下:

  num=`wc -l work.txt`
  if [ $num -gt 150 ];then
  	echo "you've worked hard enough for today."
  	echo
  fi

如果要查看详细的测试操作,可以查看man手册 man test

USB2.0信号完整性测试之眼图 名称线缆颜色引脚描述红色绿色白色GND黑色。 阅读详情

相关推荐

【液晶专题】从外挂到In-Cell/ On-Cell/ OGS再也不会傻傻分不清楚了

触控技术经历了从外挂式到内嵌式的革新,主要方案包括外挂式(Out-Cell)、OGS、On-Cell和In-Cell。

一点硬件 1252

系统管理中 bash shell 脚本常用方法总结(转)

在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了! 在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则. 1. 单引号和双引号的区别 单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符 ,不会作变量的引用,直接输出字符窜。请看如下例子: [root@linux ~]# name=HaHa

773

从放弃到再入门之拉格朗日对偶问题推导

普通同学的解法 无约束条件:求导就可以了 等式约束:代入消元,再求导 不等式约束:分情况讨论(在边界上和不在边界上),分别对应1,2的情况 然而发现,有些情况消元特别复杂,甚至不能求解 聪明同学的解法 发现:在最优点的情况下,约束曲面的法向量和目标函数的梯度反向必相同或相反 拉格朗日乘子法如何理解? (在2维里可以形象的解释为z=f(x,y)在约束条件g(x,y)=c中,极值...

qq_34564612的博客 1万+

SHELL脚本及常用命令

SHELL脚本和常用命令 什么是脚本? 脚本简单地说就是一条条的文字命令(一些指令的堆积),这些文字命令是可以看到的(如可以用记事本打开查看、编辑)。 常见的脚本: JavaScript(JS,前端),VBScript, ASP,JSP,PHP(后端),SQL(数据库操作语言),Perl,Shell,python,Ruby,JavaFX, Lua等。 为什么要学习和使用shell? Shell属于内置的脚本 程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理) 语法简单,代码写起来比较

zljuser的博客 1443

西门子828D/840DSL数控机床产量数据采集实战:一个C#程序员的踩坑与填坑记录

本文详细记录了C#程序员在西门子828D/840DSL数控机床产量数据采集实战中的经验与教训。从硬件连接到软件配置,再到数据读取与异常处理,文章分享了工业现场编程的特殊挑战和解决方案,特别是针对数控系统的TCP/IP通信、PLC变量地址映射及数据解析等关键技术点。

weixin_42741930的博客 596

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

MSS = MTU - tcpHeader - ipHeader,也就是MTU = MSS(1360) + tcpHeader(20) + ipHeader(20) = 1400,说明CAPL是可以动态设置网络底层配置参数的!然后在CAPL中设置此网卡MTU值为1400,然后创建UDP套接字,一次性发送2000个字节,在Trace窗口看看首帧报文二层Data的长度。所以我们还不能用UDP协议来验,应该用TCP协议来验,也就是在TCP三次握手时通过Tester的MSS值推导出自己的MTU值。

jasonj333 992

Linux必学:Bash的强大功能与实战技巧

Bash是Linux系统默认的命令行解释器和脚本引擎,兼具交互式操作与编程能力。作为sh的增强版,Bash支持命令历史、自动补全、变量、循环等特性,既能直接执行单条命令,也能运行.sh脚本文件实现自动化任务。通过管道、通配符等功能,Bash可高效处理文件管理、日志分析等系统操作。虽然存在zsh等现代替代品,Bash仍是Linux系统管理和脚本编写的基础工具。要确认当前Shell,可执行echo $SHELL或ps -p $$命令。掌握Bash对于Linux用户至关重要。

祯的博客 1529

装上大模型翅膀,程序员入职新公司如何快速上手代码(老员工如何选择大模型编程如虎添翼)

入职新公司,尤其是行业知识不懂的,面对前人堆积的屎山代码,各种文档又缺少的,有些技术自己又不懂的,如何快速上手代码,特别是借助AI大模型事半功倍的上手项目代码。进入新公司,我做的第一件事就是收集情报。我主动向同事们索要项目的相关资料,包括项目介绍文档、功能说明文档和业务流程图等。通过仔细阅读这些资料,可以对项目的背景和架构有了初步的了解。同时要逮住机会就向同事们请教项目的迭代历程和技术选型背后的考量。有时他们三言二语,可以为自己节省很多探索时间。在了解了项目的基本情况后,可以开始深入探究项目的业务流程。

大模型大数据攻城狮的专栏 1131

Bash语言的语法

Bash作为一种强大的命令行工具和脚本语言,在日常的系统管理和自动化任务中扮演着重要角色。通过掌握Bash的基本语法、常用命令和脚本编写技巧,用户可以更高效地与操作系统进行互动并自动化重复性工作。本文简要介绍了Bash的基本概念与用法,相信读者能够在此基础上继续深入学习,以便在实际工作中更好地运用这一工具。随着对Bash的深入了解,用户还可以发掘更多高级功能,如函数定义、数组使用和参数传递等,进而编写出更为复杂和强大的脚本。

2501_90200002的博客 1013

apollo-慢速车向左绕行

当主车前方出现其他车辆时,通过左侧车道对前车绕行。

是菜鸟o的博客 309

Calibre 3Dstack --每日一个命令day27【overlap】(3-27)

本文介绍了Calibre3Dstack中overlap命令的使用方法。该命令用于检查两个已放置层之间的重叠量是否符合要求,支持设置检查名称、层类型、堆叠范围、检查方向等参数。关键参数包括:-constraint指定重叠约束条件,-exact控制百分比精度,-by_area切换为面积检查模式,-intersection报告相交区域。检查结果可通过RVE选项定制显示方式,适用于3D堆叠设计中的层间重叠验证场景。

u013620135的博客 112

转inux Shell编程入门

http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html 从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编...

weixin_30349597的博客 67

利用Python实现Springer文献关键词爬虫

🔧 如何分析Springer的搜索结果HTML结构🕷️ 编写高性能异步爬虫抓取论文元数据📊 使用Pandas导出Excel🧠 如何处理作者、摘要、DOI等字段🔄 如何优化爬虫稳定性与可扩展性。

2201_76125261的博客 414

Linux下source bash sh ./的区别

source命令用法:   source FileName   作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"     注:该命令通常用命令“.”来替代。     如:source .bash_profile  www.2cto.com           . .bash_profile两者等效。     

ycwasdfasdf的博客 566

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Ubuntu_shell 学习

目录 基本知识 Shell Bash bash脚本 常用的bash命令 获得root权限 清屏 重启 关机 查看系统磁盘情况 查看系统进程 查看硬件设备 文本编辑命令 环境变量 安装软件 .run 与 .deb sh 与 点命令(.) chmod + 命令 软件安装方式 aptitude 与 apt-get 强制删除文件 .deb ...

Kukafee的博客 1520

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux Shell编程入门

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。 Linux的She...

seabluerain的博客 134

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

shell编程入门

从程序员的角度来看,Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用Shell脚本编程,完成更加复杂的操作。在LinuxGUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修功课之一。 Linux的Shell种类

lisa890608的专栏 475

linux shell 入门

从程序员的角度来看,Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用Shell脚本编程,完成更加复杂的操作。在LinuxGUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修功课之一。Linux的...

weixin_33752045的博客 83

shell入门

从程序员的角度来看,Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。 Linux的Shell

hyb0852的专栏 290

shell

if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句: if ... fi 语句;if ... else ... fi 语句;if ... elif ... else ... fi 语句。 case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下: case 值 in 模式1)

从来年少爱做梦,一心只想往前飞 331
上一篇: awk 如何处理两个文件,实现类似数据库表连接的操作
下一篇: shell批量修改后缀方法(# %的用法)【转】
no pay no gay
博客等级 码龄14年 73粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值