首页 > 系统相关 >就这么学Linux 编写Shell脚本

就这么学Linux 编写Shell脚本

时间:2024-09-09 16:25:43浏览次数:11  
标签:语句 Shell echo 运算符 命令 Linux 编写 root


编写Shell脚本

Shell 脚本命令的工作方式有下面两种
➢交互式 :用户每输入一条命令就立即执行
➢批处理:由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本中诸多的命令.

编写简单脚本

当前系统已经默认使用 Bash 作为命令行终端解释器了

echo $SHELL

如果想查看当前所在工作路径并列出当前目录下所有的文件及属性信息,实现这个功能的脚本应该类似于下面这样:

vim example.sh

bash example.sh

除了上面用 Bash 解释器命令直接运行 Shell 脚本文件外,第二种运行脚本程序的方法是通过输入完整路径的方式来执行。但默认会因为权限不足而提示报错信息,此时只需要为脚本文件增加执行权限即可。

./example.sh
chmod u+x example.sh
./example.sh

接收用户的参数

当用户执行某一个命令时,加或不加参数的输出结果是不同的:

wc -l anaconda-ks.cfg
wc -c anaconda-ks.cfg
wu -w anaconda-ks.cfg

已经内设了用于接收参数的变量,变量之间使用空格间隔。例如,$0 对应的是当前 Shell 脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而$1、$2、$3……则分别对应着第 N 个位置的参数值,如图所示。

就这么学Linux 编写Shell脚本_运算符

vim example.sh

#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。"
echo "第 1 个参数为$1,第 5 个为$5。"

bash example.sh one two three four five six

输出

当前脚本名称为 example.sh
总共有 6 个参数,分别是 one two three four five six。
第 1 个参数为 one,第 5 个为 five。

判断用户的参数

就这么学Linux 编写Shell脚本_Shell_02


按照测试对象来划分,条件测试语句可以分为 4 种:

➢ 文件测试语句;

➢ 逻辑测试语句;

➢ 整数值比较语句;

➢ 字符串比较语句。文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符,具体的参数如表所示。

就这么学Linux 编写Shell脚本_运维_03


下面使用文件测试语句来判断/etc/fstab 是否为一个目录类型的文件,然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为 0,则目录存在;如果返回值为非零的值,则意味着它不是目录,或这个目录不存在:

[ -d /etc/fstab  ]
echo $?

再使用文件测试语句来判断/etc/fstab 是否为一般文件,如果返回值为 0,则代表文件存在,且为一般文件:

[ -f /etc/fstab ]
echo $?

逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果。例如在 Shell终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令,因此可以用来判断/dev/cdrom 文件是否存在,若存在则输出 Exist 字样

[ -e /dev/cdrom ] && echo "Exist"

除了逻辑“与”外,还有逻辑“或”,它在 Linux 系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令,因此可以用来结合系统环境变量 USER 来判断当前登录的用户是否为非管理员身份:

echo $USER
[ $USER = root ] || echo "user"
su - linuxprobe

第三种逻辑语句是“非”,在 Linux 系统中的运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值。也就是说,如果原本测试的结果是正确的,则将其变成错误的;原本测试错误的结果,则将其变成正确的。

我们现在切换回到 root 管理员身份,再判断当前用户是否为一个非管理员的用户。由于判断结果因为两次否定而变成正确,因此会正常地输出预设信息:

exit
[ ! $user = root ] || echo "administrator"

叹号应该放到判断语句的前面,代表对整个的测试语句进行取反值操作,而不应该写成“$USER != root”,因为“!=”代表的是不等于符号(≠),尽管执行效果一样,但缺少了逻辑关系,这一点还请多加注意。

当前我们正在登录的即为管理员用户—root。下面这个示例的执行顺序是,先判断当前登录用户的 USER 变量名称是否等于 root,然后用逻辑“非”运算符进行取反操作,效果就变成了判断当前登录的用户是否为非管理员用户。最后若条件成立,则会根据逻辑“与”运算符输出 user 字样;若条件不满足,则会通过逻辑“或”运算符输出 root 字样,而只有在前面的&&不成立时才会执行后面的||符号。

[ ! $USER = root ] && echo "user" || echo "root"

整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然地使用日常生活中的等号、大于号、小于号等来判断。因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突。因此一定要使用规范的整数比较运算符来进行操作。可用的整数比较运算符如表所示。

就这么学Linux 编写Shell脚本_运算符_04

[ 10 -gt 10 ] 
echo $?

[ 10 -eq 10 ]
echo $?

free 命令,它能够用来获取当前系统正在使用及可用的内存量信息。接下来先使用 free -m 命令查看内存使用量情况(单位为 MB),然后通过“grep Mem:”命令过滤出剩余内存量的行,再用 awk '{print $4}'命令只保留第 4 列。

free -m
free -m | grep Mem:
free -m | grep Mem: | awk '{print $4}'

如果想把这个命令写入到 Shell 脚本中,那么建议把输出结果赋值给一个变量,以方便其他命令进行调用:

FreeMen=`free -m | grep Mem: | awk '{print $4}'`

echo $FreeMen

我们使用整数运算符来判断内存可用量的值是否小于 1024,若小于则会提示“Insufficient Memory”(内存不足)的字样:

[ $FreeMen -lt 1024 ] && echo "Insufficient Memory"

字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值),理解起来也比较简单。字符串比较中常见的运算符如表所示。

就这么学Linux 编写Shell脚本_运维_05


接下来通过判断 String 变量是否为空值,进而判断是否定义了这个变量:

[ -z $String ]
echo $?

再次尝试引入逻辑运算符来试一下。当用于保存当前语系的环境变量值 LANG 不是英语(en.US)时,则会满足逻辑测试条件并输出“Not en.US”(非英语)的字样:

echo $LANG
[ ! $LANG = "en.US" ] && echo "Not en.US"


标签:语句,Shell,echo,运算符,命令,Linux,编写,root
From: https://blog.51cto.com/guog/11961724

相关文章

  • Linux 基础命令
    Linux基础命令优秀教程1、史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了2、10分钟让你掌握Linux常用命令(+3万+++收藏)3、Linux常用命令大全4、着重推荐⭐⭐⭐Linux命令大全(手册)文件和目录操作ls:列出目录内容cd:切换目录pwd:显示当前工作目录mkdir:创建新目录cp......
  • 就这么学Linux 常用系统工作命令
    常用系统工作命令快捷键1、man2、echo3、date4、timedatectl5、reboot6、poweroff7、wget8、ps9、pstree10、top11、nice12、pidof13、kill14、killall快捷键tab:自动补全ctrl+C:终止进程ctrl+D:键盘输入结束CTRL+L:清屏1、manman命令中得信息结构2、echoecho命令用于在终端......
  • 【Linux】vim关闭终端的时候,忘记退出vim怎么办
    有些时候经常是关闭终端,但是忘记退出vim编辑的文本,每次登陆的时候会提示这个错误 其实很简单,在该文本的路径下,有一个隐藏文件叫.xxx.txt.swp文件(xxx就是你退出忘记关闭的文件名)、如果没找到的话,用ls-a查看就能看到这个文件就是罪魁祸首,删掉他就可以了rm-f.666.txt.swp......
  • 常用的linux命令以及详解
    Linux系统中包含了大量的命令,这些命令是用户与系统交互的主要方式。以下是一些常用的Linux命令及其详细解释:1.文件和目录操作ls:列出目录内容。ls:列出当前目录的文件和子目录。ls-l:以长格式列出文件和目录,包括权限、所有者、大小和修改时间。ls-a:显示所有文件,包括隐藏文......
  • linux系统usb设备的自动挂载、自动卸载(udev-media-automount)
    不推荐通过编辑/etc/fstab文件挂载方式,因为一旦拔掉硬盘或者更换硬盘后,系统就启动不起来了。这里推荐使用udev-media-automount开源网址: https://github.com/Ferk/udev-media-automount1、下载软件包:cd/目录,进入某个目录下,然后通过一下命令下载或者直接下载解压拷贝进去......
  • Linux脚本中 指令返回值得获取,已经参数等获取
    在写脚本时,经常遇到这样的问题:如何获取当前进程号,脚本执行过的命令的进程号?如何获取当前时间?如何得到参数个数?如何得到脚本中各命令的返回信息?。。。。其实这些信息都能轻松从shell预定义的一些特殊变量获得,下面总结了一些常用的。 特殊的shell变量:#获取当前执行的sh......
  • kubectl top输出与Linux free命令不一致原因
    kubectltop命令和Linux的free命令都用于查看系统资源的使用情况,但它们的输出可能不一致,原因主要包括以下几点:1.数据来源不同kubectltop:该命令从Kubernetes的MetricsServer收集节点和Pod的资源使用情况。MetricsServer会定期收集容器的CPU和内存使用数据,并......
  • linux proxy 【linux 代理】
    服务端略客户端proxy_url="http://192.168.21.101:7890"exportno_proxy="192.168.21.2,10.0.0.0/8,192.168.0.0/16,localhost,127.0.0.0/8,.coding.net,.tencentyun.com,.myqcloud.com"#proxysettingsenable_proxy(){exporthttp_proxy="${prox......
  • Linux df和du原理
    目录使用场景原理1.df工作原理2.du工作原理3.区别df和du显示的数据不一致的情况1.df比du大2.df比du小du查看隐藏文件为什么overlay文件系统路径用du看到的是完整的带覆盖的占用,而非实际使用使用场景du:用于查看文件路径的空间使用情况df:用于查看盘的空间使用情况原理1.df工......
  • 更换Linux系统镜像源
    更换Linux系统镜像源切换镜像源通常是为了提高软件包下载的速度和稳定性。以下是CentOS7切换镜像源的一般步骤:一、安装wget(如果尚未安装)首先,需要确保系统中安装了wget工具,因为wget可以用来下载文件。如果系统中没有wget,可以通过以下命令安装:yuminstall-ywget二、选择并......