首页 > 系统相关 >shell/bash脚本编程

shell/bash脚本编程

时间:2023-04-21 10:33:54浏览次数:51  
标签:脚本 bin shell 编程 FILE True bash

原文地址 zhuanlan.zhihu.com

shell/bash脚本编程

残枫cps残枫cps

​目录收起介绍我们的第一个脚本脚本解释器用户输入测试条件判断迭代语句 - 循环参数传递退出状态码逻辑操作符函数函数参数传递通配符调试

原文地址 zhuanlan.zhihu.com

原文链接

对于我自己来说,学习新框架或技术的最佳方式是同时获得实践经验,在本文中,你将自己通过编写代码来学习shell脚本的基础知识!本文包含语法,shell脚本的基础知识到中级shell编程,通过这篇文章你可以学习shell的相关知识,并且通过shell来实现Unix/Linux之间的接口

介绍

您可能已经多次遇到过“脚本”这个词,但脚本的的含义是什么意思呢?简单的来说,脚本是包含一系列要执行的命令。这些命令由解释器执行。一切你可以在命令行中输入的命令,你都可以把它放到脚本中。而且,脚本非常适合自动化任务。如果你发现自己频繁重复一些命令,你可以创建一个脚本来实现它!

The Linux philosophy is ‘Laugh in the face of danger’. Oops. Wrong One. ‘Do it yourself’. Yes, that’s it.
 — Linus Torvalds

我们的第一个脚本

script.sh

#!/bin/bash
echo "My First Script!"

运行脚本

$ chmod 755 script.sh # chmod +x script.sh
$ ./script.sh

好流弊 !你刚刚编写了你的第一个bash脚本。我知道你不理解这个脚本,特别对于脚本中的第一行。不要担心我将在本文中详细介绍shell脚本,在进入任何主题之前,我总是建议在脑海中形成路线图或适当的内容索引,并明确我们将要学习的内容。因此,以下是我们将在文章中讨论的一些要点。

  • 脚本解释器
  • 变量
  • 用户输入
  • 测试
  • 条件判断
  • 循环语句
  • 脚本参数传递
  • 退出状态码
  • 逻辑操作符
  • 函数
  • 通配符
  • 调试

所以,这将是我们讨论的顺序,在本文的最后,我相信你会有足够的信心编写自己的shell脚本:)

Happy Learning Guys

脚本解释器

你可以从上面脚本的第一行看到 #!/bin/bash 这行指定了你的程序将使用那个解释器,基本上是将路径引用到解释器。Linux/Unix中有很多解释器,其中一些是:bash,zsh,sh,csh和ksh等。

这里推荐一个玩命令行必须知道的一个开源项目oh-my-zsh

All the best people in life seem to like LINUX. — Steve Wozniak

查看你的系统中有那些脚本解释器

cat /etc/shells

bash: #!/bin/bashzsh: #!/bin/zshksh: #!/bin/kshcsh: #!/bin/cshand so on…

注意⚠️如果脚本不包含解释器,则使用你的默认shell执行命令,因此代码可能正常运行,虽然是这样,但是不推荐这样做,使用echo $SHELL可以知道你当前使用的解释器

注释注释以#开始,#后面的内容会被解释器忽略,但是#!另当别论

变量变量指向内存中的一块区域,变量有对应的变量名和值,可以存储一些可以在将来更改的数据,shell中定义变量不需要指定变量的类型

VARIABLE_

当命名一个变量是你必须记得以下几点 变量名是区分大小写的
为了方便,变量名最好大写

  • 要使用变量,必须在变量前面加$符号

例子

#!/bin/bash
MY_
echo "Hello, I am $MY_NAME"

OR

#!/bin/bash
MY_
echo "Hello, I am ${MY_NAME}"

提示: 可以把命令执行后的输入结果赋值给一个变量

LIST=$(ls)
SERVER_NAME=$(hostname)

合法的变量名

THIS3VARIABLE=”ABC”
THIS_IS_VARIABLE=”ABC”
thisIsVariable=”ABC”

不合法的变量名

4Number=”NUM”
This-Is-Var=”VAR”
# No special character apart from underscore is allowed!

用户输入

read 命令接收键盘的输入,标准输入(Standard Input)

read -p "PROMPT MESSAGE" VARIABLE

其中PROMPT MESSAGE为提示用户的信息,变量VARIABLE可以保存用户的输入,可以在程序中使用该变量

#!/bin/bash
read -p "Please Enter You Name: " NAME
echo "Your Name Is: $NAME"

测试

测试主要用于条件判断。[ condition-to-test-for ] ,如[ -e /etc/passwd ],注意的是[]前后必须有空格,如[-e /etc/passwd]是错误的写法

  1. 文件测试操作
-d FILE_NAM  # True if FILE_NAM is a directory
-e FILE_NAM  # True if FILE_NAM exists
-f FILE_NAM  # True if FILE_NAM exists and is a regular file
-r FILE_NAM  # True if FILE_NAM is readable
-s FILE_NAM  # True if FILE_NAM exists and is not empty
-w FILE_NAM  # True if FILE_NAM has write permission
-x FILE_NAM  # True if FILE_NAM is executable
  1. 字符串测试操作
-z STRING  # True if STRING is empty
-n STRING  # True if STRING is not empty
STRING1 = STRIN2 # True if strings are equal
STRING1 != STRIN2 # True if strings are not equal
  1. 算术测试操作
var1 -eq var2  # True if var1 is equal to var2
var1 -ne var2  # True if var1 not equal to var2
var1 -lt var2  # True if var1 is less than var2
var1 -le var2  # True if var1 is less than or equal to var2
var1 -gt var2  # True if var1 is greater than var2
var1 -ge var2  # True if var1 is greater than or equal to var2

条件判断

和其他编程语言一样,shell脚本也能基于条件进行判断,我们可以使用if-elseif-elif-else

Avoid the Gates of Hell. Use Linux!

  1. if 语句
if [ condition-is-true ]
then
  command 1
  command 2
    ...
    ...
  command N
fi

if-else

if [ condition-is-true ]
then
  command 1
elif [ condition-is-true ]
then
  command 2
elif [ condition-is-true ]
then
  command 3
else
  command 4
fi
  1. case语句case可以实现和if一样的功能,但是当条件判断很多的时候,使用if不太方便,比如使用if进行值的比较
case "$VAR" in
  pattern_1)
    # commands when $VAR matches pattern 1
    ;;
  pattern_2)
    # commands when $VAR matches pattern 2
    ;;
  *)
    # This will run if $VAR doesnt match any of the given patterns
    ;;
esac

例子

#!/bin/bash
read -p "Enter the answer in Y/N: " ANSWER
case "$ANSWER" in
  [yY] | [yY][eE][sS])
    echo "The Answer is Yes :)"
    ;;
  [nN] | [nN][oO])
    echo "The Answer is No :("
    ;;
  *)
    echo "Invalid Answer :/"
    ;;
esac

迭代语句 - 循环

可以通过循环执行同一个代码块很多次

  1. for循环
for VARIABLE_NAME in ITEM_1 ITEM_N
do
  command 1
  command 2
    ...
    ...
  command N
done

Example

#!/bin/bash
COLORS="red green blue"
for COLOR in $COLORS
do
  echo "The Color is: ${COLOR}"
done

Another Example

for (( VAR=1;VAR<N;VAR++ ))
do
  command 1
  command 2
    ...
    ...
  command N
done

在当前所有txt文件前面追加new实现重命名

#!/bin/bash
FILES=$(ls *txt)
NEW="new"
for FILE in $FILES
do
  echo "Renaming $FILE to new-$FILE"
  mv $FILE $NEW-$FILE
done
  1. while 循环
    当所给的条件为true时,循环执行while里面的代码块
while [ CONNDITION_IS_TRUE ]
do
  # Commands will change he entry condition
  command 1
  command 2
    ...
    ...
  command N
done

判断条件可以是任意的测试或者命令,如果测试或命令返回0,则表示条件成立,如果为非0则退出循环,如果一开始条件就不成立,则循环永远不会执行。
如果你不知道退出状态码是什么请不要担心,我后面会告诉你

标签:脚本,bin,shell,编程,FILE,True,bash
From: https://www.cnblogs.com/cps666/p/17339455.html

相关文章

  • SWT shell设置可变大小
    SWTshell设置可变大小 Shellshell=newShell(shell,SWT.SHELL_TRIM)SWT.SHELL_TRIM会在shell窗口中加上最大小,最小化,关闭,以及窗口可变大小 本文来自博客园,作者:jason_bo,转载请注明原文链接:https://www.cnblogs.com/jasonboboblog/p/13398550.html......
  • Xshell 7 要继续使用此程序,您必须应用最新的更新或使用新版本
    一、遇到问题今天用Xshell7的时候,突然弹窗提示“要继续使用此程序,您必须应用最新的更新或使用新版本”点击确定后,过一会提示“已更新到最新版本”但是就是打不开Xshell7,没办法就只能上官网重新下载一个二、解决问题官网:https://www.xshell.com/zh/free-for-home-school/填写姓名......
  • Hibernate 教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用J......
  • PHP 教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介PHP开发入门教程-一个简单而简短的PHP教程和所有内置PHP函数的完整参考手册。本教程是为初学者和高级开发人员设计的。您将了解PHP内置函数,预定义变量示例,面向对象的PHP,数字,标量,数组,散列文件I/O,IF,ELSEIF,执行,循环,运算符,正则表达式,GET,POST,子程序,编码标准,模块,文件管理,套......
  • 编程打卡:C语言趣味编程习题做
    编程打卡:C语言趣味编程习题做求车速问题描述已知一个对称数里程数,2小时之后它又变成了一个对称数,求速度。设计思路很明显看出来95859的下一个对称数是95959,再下一个对称数是96069,不,还是每次增加,然后再判断对称数吧。流程图graphA[开始]-->B[i=95859+1]-->C[i++]-->D{i......
  • 每日编程一小时(第十一天)
    一.问题描述递归法编写程序求勒让德多项式的值二.设计思路1.数入两个数n,x2.编写一个函数当n==0,p=1;n==1,p==x;n>1,p=((2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x))/n 返回值为p,实现递归调用3.输出三.流程图 四.程序实现#include<iostream>usingnam......
  • PHP 教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介PHP开发入门教程-一个简单而简短的PHP教程和所有内置PHP函数的完整参考手册。本教程是为初学者和高级开发人员设计的。您将了解PHP内置函数,预定义变量示例,面向对象的PHP,数字,标量,数组,散列文件I/O,IF,ELSEIF,执行,循环,运算符,正则表达式,GET,POST,子程序,编码标准,模块,文件管理,套......
  • java -- 函数式编程
    函数式编程面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是怎么做。有时只是为了做某事情而不得不创建一个对象,而传递一段代码才是我们真正的目的。LambdaLambda是一个匿名函数,可以理解为一段可以传递的代码。......
  • udp编程及udp常见问题处理
    前言UDP协议是UserDatagramProtocol的缩写,它是无连接,不可靠的网络协议。一般使用它进行实时性数据的传输,主要是因为它快,但因为它是不可靠的一种传输协议,所以不可避免的会出现丢包现象。本文就具体讨论导致UDP传输数据包丢失的原因以及一些基本的规避方法:路由器转发造成的数据......
  • GUI编程
    GUI编程组件:窗口弹窗面板文本框列表框按钮图片监听事件鼠标键盘事件破解工具1.简介GUI的核心技术:SwingAWT,因为界面不美观。​ 1.需要GRE环境​ 2.需要界面不美观为什么要学习?​ 1.可以写出自己心中想要的一些小工具​ 2.工作时候,也可能需要维护到Swing界......