请选择 进入手机版 | 继续访问电脑版
MSIPO技术圈 首页 IT技术 查看内容

shell编程(待完善)

2023-07-13

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

查看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输出

本地变量(临时变量),# 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

相关阅读

热门文章

    手机版|MSIPO技术圈 皖ICP备19022944号-2

    Copyright © 2024, msipo.com

    返回顶部