shell编程(待完善)

这篇具有很好参考价值的文章主要介绍了shell编程(待完善)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、shell概述
编译型语言(java),通过编译器将程序的高级语言翻译成机器语言,一次编译多次运行,运行时不需要重新翻译直接使用编译的结果,程序执行效率高,依赖编译器,跨平台性差。
解释型语言(shell),通过解释器将程序的高级语言翻译成机器语言,每执行一次都要翻译一次、程序执行效率低。
shell解释器,用户在终端程序输入命令,shell 将命令翻译给Linux内核,内核再去调用系统硬件。shell解释器将命令解析成计算机语言,告诉内核来调用物理硬件。
打开终端程序默认有个bash,bash就是shell的一种类型(bash shell),在终端上敲任何命令,会有bash去解析命令,解析命令的是bash不是终端,终端只是个程序。文章来源地址https://www.toymoban.com/news/detail-541400.html

查看shell种类,# cat /etc/shells
/bin/sh     #是bash shell的一个快捷方式,sh和bash是一个东西
/bin/bash   #bash shell是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能
/sbin/nologin    #表示非交互的,不能登录操作系统
/bin/dash   #小巧,高效,功能相比少一些
/bin/tcsh   #是csh的增强版,完全兼容csh
/bin/csh    #具有C语言风格的一种shell,具有许多特性,但也有一些缺陷
在终端输入不同的bash(如# /bin/dash)回车可切换到不同的shell,不同的shell有些命令使用方式也不同。
Shell脚本文件的名称按功能来见名思义,为了避免被误以为是普通文件,最好shell脚本名是以.sh结尾
# vim shell01.sh 脚本里面编写命令,最好是一条命令独占一行,要是多条命令在同一行使用分号;隔开不同命令
#!/bin/bash  脚本第一行固定写法,指定脚本代码执行的shell解释器

使用标准脚本执行方法前提是脚本要有可执行权限x,# chmod +x shell01.sh  相当于文件ugo即a都加了x权限
标准脚本执行方法是使用脚本的绝对路径或相对路径,使用相对路径直接在脚本所在目录输入脚本名不行,要加个./指明当前路径下./shell01.sh
# /shell/shell01/shell01.sh  或# ./shell01.sh

脚本没有可执行权限x可用非标准执行方法(直接用shell解释器解析脚本)# bash shell01.sh 或# sh shell01.sh 等不同shell解释器直接解析脚本
非标准执行方法还有这两种执行方式,source和点.
# source shell01.sh
# . shell01.sh
source. 表示读取文件,执行文件里的命令,
在写配置文件让其立即生效时用到

-x:一般用于排错,查看脚本的执行过程
# bash -x shell01.sh    +代表程序命令本身,没有加号表示命令执行结果
-n:用来查看脚本的语法是否有问题
# bash -n shell01.sh
*:	匹配0或多个任意字符
?:	匹配任意单个字符
[]:	匹配[]中的任意单个字符[abcd][a,b,c,d],或者一组单个字符[a-d]
[!]: 匹配除[]中的任意单个字符
{string1,string2,...}:匹配string1,string2或更多字符串,多个字符串之间用逗号隔开,一组字符串用两个点隔开file{1..5}
1、双引号"",会把引号的内容当成整体来看待,允许通过$符号引用其他变量值
2、单引号'',会把引号的内容当成整体来看待,禁止引用其他变量值
3、反撇号``:类似双引号中允许$变量调用的作用,
如果存在嵌套,反撇号不能用(反撇号嵌套会报错,多个撇号会区分不了起始结束撇号````)
# echo "$(date +%F)" 
# echo "`date +%F`" 
$()和反撇号``里面的命令先执行,再echo输出
$(command) 引用命令执行的结果

本地变量(临时变量),# A=hello    # echo $A
当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
# env,查看当前用户的环境变量,本地变量用export导出就是环境变量
# set,查询当前用户的所有变量(本地变量与环境变量)
# export  变量名,将当前变量(本地变量)变成环境变量 (临时生效)
# export A=hello (等同于# A=hello和# export A) 
临时将一个本地变量变成环境变量
# env|grep ^A
# export PATH=$PATH:要添加的命令的路径,
export PATHPATH本地临时变量变为环境变量(临时生效)

永久生效:/etc下面的配置文件是全局的
/etc/profile 系统和每个用户的环境变量 
/etc/bashrc  使用bash shell用户的bash信息(aliase别名、umask掩码、函数等)
vim /etc/profile 
export A=hello
export PATH=$PATH:要添加的命令的路径
# source /etc/profile  重新读取配置文件让其立即生效

~/当前用户的(局部变量),在每个用户家目录下有以点开头的配置文件
~/.bash_profile,当前用户的环境变量
~/.bashrc,当前用户的bash信息(aliase别名、umask掩码、函数等)
~/.bash_logout,每个用户退出当前shell时最后读取的文件

用户登录系统读取相关文件的顺序:
/etc/profile——>~/.bash_profile——>~/.bashrc——>/etc/bashrc——>~/.bash_logout

系统变量(内置bash中变量)
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常
$$:当前所在进程的进程号   # kill -9 `echo $$` 等同于exit命令,退出当前会话
$!:后台运行的最后一个进程号  
!$	调用最后一条命令历史中的参数
!!	调用最后一条命令历史

$#:脚本后面接的参数(变量)的个数
$*:表示将变量看成一个整体,整体在一行输出所有参数变量,所有参数变量空格隔开在一行展示
$@:表示变量是独立的,换行输出每个参数变量
./1.sh a b c 执行1.sh脚本传abc三个参数
./1.sh 执行1.sh脚本不传参数
$0:当前执行的进程/程序名,# echo $0	    
$1~$9 位置参数变量,即第几个参数
${10}~${n} 扩展位置参数变量,第10个位置变量及后面的变量必须用{}大括号括起来

自定义变量
1. 默认情况下,shell里定义的变量是不分类型的,可以给变量赋予任何类型的值;
等号两边不能有空格,变量名=变量值,A=hello
对于有空格的字符串做为赋值时,要用引号引起来,A="hello world"
2. 变量的获取方式:$变量名 或${变量名}	
# A=12345678
# echo $A  或# echo ${A}
如果获取变量的全部两个都可以;如果获取变量的某一部分,用${}
# echo ${A:2:3}	获取变量部分长度
A表示变量名;2表示从第3个字符开始(0代表第一个字符);3表示截取字符长度
3. 取消变量: # unset 变量名
4. 变量名区分大小写,同名称但大小写不同的变量名是不同的变量
5. 变量名可以是字母或数字或下划线,但是不能以数字或者特殊符号开头
6. 命令的执行结果可以保存到变量
# A=`date +%F`# A=$(date +%F)
# echo $A
7. 有类型变量 declare
-i 将变量看成整数(整型) 
-r 使变量只读readonly
不能再次给此变量赋值进行覆盖,也不能用unset取消变量
可退出终端让其失效,因为它是临时本地变量
-x 标记变量为环境变量(export 变量名)
-a 指定为普通数组;也能查看普通数组
-A 指定为关联数组;也能查看关联数组
# a=10
# b=20
# echo $a+$b
10+20
# declare -i a=2
# declare -i b=4
# declare -i c=$a+$b
# echo $c
6
8. 数组
普通数组:只能使用整数作为数组索引(元素下标)
关联数组:可以使用字符串作为数组索引(元素下标)
普通数组定义:用括号[]来表示数组,数组元素(变量)用“空格”符号分割开。
一次赋一个值:变量名=变量值
array[0]=v1
array[1]=v2
array[2]=v3
一次赋多个值:array=(var1 var2 var3 var4)
将文件中每一行赋值给array1数组
array1=(`cat /etc/passwd`)
array2=($(ls /root))
array3=(1 2 harry "Miss Hou" [7]=tom)
读取数组:${array[i]}  i表示元素的下标
使用@或*可以获取数组中的所有元素:
echo ${array[0]}获取第一个元素
echo ${array[*]}或echo ${array[@]}获取数组里的所有元素
echo ${#array[*]}获取数组里所有元素个数
echo ${!array[*]}获取数组元素的索引下标
echo ${array[*]:1:2}访问指定的元素;1代表从索引下标为1的元素开始获取;2代表获取后面几个元素
echo ${array[*]:1:2} 获取数组中第二个和第三个元素
查看普通数组信息:# declare -a
声明关联数组,# declare -A 关联数组名
# declare -A asso_array1
# declare -A asso_array2
数组赋值:一次赋一个值:数组名[索引]=变量值
# asso_array1[linux]=1
# asso_array1[java]=2
# asso_array1[php]=3
一次赋多个值:(关联数组要指定索引下标)
# asso_array2=([name1]=harry [name2]=jack [name3]=amy)
读取数组:
# echo ${asso_array1[*]} 关联数组获取所有元素是无序的
# echo ${asso_array1[linux]} 获取单个元素
查看关联数组信息:# declare -A
9. 交互式定义变量的值 
# read 变量名 主要用于让用户去定义变量值
-p 提示信息
-n 字符数 (限制变量值的字符数)
-s 不显示   
-t 超时(默认单位秒)(限制用户输入变量值的超时时间)
# read -p "Input your name:" name
# echo $name

一次性定义多个交互变量,定义多个变量时用空格隔开,输入多个变量值时用空格隔开,
从文件中获取内容给多个变量赋值,文件中内容也是要用空格隔开
# cat 1.txt 
10.1.1.1 255.255.255.0
从文件中获取内容给多个变量赋值,< 是标准输入
# read -p "Input your IP and Netmask:" ip mask < 1.txt 
# echo $ip
10.1.1.1
# echo $mask
255.255.255.0

到了这里,关于shell编程(待完善)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Shell】Shell编程之免交互

    免交互:不需要人为控制就可以完成的自动化操作 Shell脚本和免交互是一个概念,但是两种写法 here document        使用i/o重定向的方式将命令的列表提供给交互式的程序或者命令                                 是一种标准输入,只能接受正确的指令或命令(错误的不行

    2024年02月15日
    浏览(31)
  • 如何查看 Chrome 网站有没有前端 JavaScript 报错?

    您可以按照以下步骤在Chrome中查看网站是否存在前端JavaScript报错: 首先,打开Chrome浏览器并访问您想要检查JavaScript报错的网站。 在Chrome浏览器中,按下\\\"Ctrl+Shift+I\\\"(在Windows和Linux上)或\\\"Cmd+Option+I\\\"(在macOS上)快捷键,打开开发者工具。 在开发者工具窗口中,点击位于顶部

    2024年02月15日
    浏览(48)
  • Chrome 基于 Wappalyzer 查看网站所用的前端技术栈

    1. 找到谷歌商店 https://chrome.google.com/webstore/search/wappalyzer?utm_source=ext_app_menu 2. 搜索 Wappalyzer 3. 添加至Chrome 4. 使用 插件 比如打开 https://www.bilibili.com/ 就可以看到其所以用的前端技术栈了

    2024年02月08日
    浏览(40)
  • 一个好用快捷的前端请求代理chrome插件-ReRes

    简介 前端日常开发过程中,本地调试阶段总会有对远程接口的调用需求,通常可能会有以下途径: 本地nginx进行反向代理 使用http-proxy 修改host文件 后端配合开启跨域 但这些方法都会略显繁琐,有时候我的需求可能只是想代理某一个请求,而非所有请求,这时候可以使用一个

    2024年02月09日
    浏览(92)
  • 16个最佳Chrome插件推荐给做前端的你

    作为Web开发人员每天的工作就是不断地开发、测试、优化,涉及到语言、布局、字体、样式等技术。整个开发过程离不开浏览器。浏览器插件就像是浏览器的“装备”,可以增加浏览器额外的特性和功能。针对开发人员的日常工作,有些浏览器插件非常实用、高效,有助于开

    2024年02月06日
    浏览(35)
  • Shell 编程:探索 Shell 的基本概念与用法

    目录 Shell 简介 Shell 脚本 Shell 脚本运行 Shell 变量 1、创建变量和赋值 2、引用变量 3、修改变量的值 4、只读变量 5、删除变量 6、环境变量 Shell 字符串操作 1、拼接字符串 2、字符串长度 3、字符串截取 Shell 数组 1、创建数组 2、访问数组元素 shell 传递参数 1、位置参数 2、特殊

    2024年02月11日
    浏览(47)
  • Python调用Shell命令 (python,shell 混合编程)

    Python经常被称作“胶水语言”,因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库,也当然可以用Python调用Shell命令。 用Python调用Shell命令有如下几种方式: os .system( \\\"The command you want\\\" ). os .system( \\\"lscpu\\\" ). os .system( \\\"ls -al\\\" ). 这个调用相当直接,且是同步进行的

    2024年02月16日
    浏览(46)
  • 前端笔记 ---- Chrome 浏览器不能跨域访问解决方案

    1. 需求场景 Chrome 浏览器开发 H5 进行接口联调时,浏览器不允许跨域访问; 想通过浏览器设置,不使用代理等,浏览器可以进行跨域访问。 2. 报错图片 3. 解决方案 3.1 获取Chrome 浏览器安装位置 3.2 设置允许跨域和不验证证书 3.3 cmd 执行设置命令 3.4 组成完整命令 3.5 cmd 运行命

    2024年02月15日
    浏览(50)
  • 【Shell编程练习】编写 shell 脚本,打印 9*9 乘法表

    输出Hello World 通过位置变量创建 Linux 系统账户及密码 监控内存和磁盘容量,小于给定值时报警 猜大小 输入三个数并进行升序排序 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态 运行结果: seq 是一个用于生成数字序列的命令。它的基本语

    2024年01月17日
    浏览(50)
  • 第九章 shell 编程

    第九章 shell 编程 一、 编写与执行 Shell 脚本 • shell 脚本的作用类似于 DOS 的批处理文件,但无文件名规定。 • shell 脚本是文本文件,可用 vi、gedit 或其它文本编辑去创建。 • 脚本的首行应是#!/bin/sh,指明该用什么程序来解释该脚本。 • 使用 chmod +x 命令为脚本文件增加可

    2024年02月06日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包