2026/2/14 3:14:14
网站建设
项目流程
潍坊大型网站建设,泉州握旗公司网站建设,公司网站建设手机端跟PC端,wordpress4.6.1中文版一、Shell 的基本概念
Linux中的Shell是用户与操作系统内核之间的命令行解释器#xff0c;是Linux系统的重要组成部分。它既是一种命令语言#xff0c;又是一种程序设计语言。作为命令语言#xff0c;它交互式地解释和执行用户输入的命令#xff1b;作为程序设计语言…一、Shell 的基本概念Linux中的Shell是用户与操作系统内核之间的命令行解释器是Linux系统的重要组成部分。它既是一种命令语言又是一种程序设计语言。作为命令语言它交互式地解释和执行用户输入的命令作为程序设计语言它定义了各种变量和参数并提供了许多控制结构可以编写脚本程序来自动化任务。在Linux中有多种不同的Shell每种都有其特点。常见的Shell包括BashBourne Again Shell、ZshZ Shell、FishFriendly Interactive Shell等。其中Bash是最流行和最常用的Shell是许多Linux发行版的默认Shell。二、Shell 的主要功能命令解释读取用户输入的命令解释并执行。脚本编程通过编写Shell脚本将一系列命令组合起来实现自动化。环境配置管理用户环境变量定制Shell行为。作业控制控制和管理后台作业、进程等。三、Shell 变量3.1 什么是 Shell 变量存储单元用于存储数据的命名空间临时存储通常只在当前 Shell 会话中有效动态类型无需声明类型值决定类型常见的变量# 变量名值nameJohn Doe# 字符串变量age30# 整数变量PI3.14159# 浮点数实际存储为字符串activetrue# 布尔值实际存储为字符串变量命名规则# 有效变量名VARNAMEvalue_var_namevaluevar123valueVAR_NAMEvalue# 推荐使用大写字母和下划线# 无效变量名会报错123varvalue# 不能以数字开头var-namevalue# 不能包含连字符varnamevalue# 不能包含空格$varvalue# 不能以$开头# 测试变量名是否有效valid_name(){[[$1~^[a-zA-Z_][a-zA-Z0-9_]*$]]echo有效||echo无效}valid_namemy_var# 有效valid_name123var# 无效valid_namevar-name# 无效3.2 变量类型3.2.1 用户自定义变量# 定义变量前后不能有空格nameJohnage25path/usr/local/bin# 使用变量echo$nameecho${name}# 推荐使用大括号避免歧义3.2.2 环境变量可以使用export命令行声明这种属于临时环境变量只在当前Shell会话中生效关闭当前Shell会话后失效。永久环境变量需要修。改/etc/profile配置文件在该文件中定义的变量永久生效。对所有子进程可见通常大写命名。## 定义一个临时环境变量exportnametom## 定义一个永久环境变量vim/etc/profile## 进入编辑模式后添加一个想要设置的环境变量后保存退出WORLDworld## 使用下面命令刷新/etc/profile文件否则不会立即生效source/etc/profile# 查看所有环境变量envprintenv# 常见环境变量echo$HOME# 用户家目录echo$PATH# 命令搜索路径echo$USER# 当前用户echo$SHELL# 当前 Shellecho$PWD# 当前目录echo$PS1# 主提示符3.2.3 位置参数变量脚本或函数参数相关使用$1,$2,$3 … ${10}, ${11} …表示10以后的数字全部用大括号{}括起来$数字表示脚本文件后跟的第几个参数。$0代表文件本身。#!/bin/bashecho脚本名:$0echo第一个参数:$1echo第二个参数:$2echo参数总数:$#echo所有参数:$echo所有参数:$*echo上条命令退出状态:$?# 0成功非0失败3.2.4 特殊变量$?代表上一条命令的结果返回的值命令执行成功返回0值失败返回非0值 , return 退出函数时获取的返回值0-255超过部分%256取余。$$代表脚本运行的当前进程ID号。$!代表后台运行的最后一个进程的ID号。$#代表传递到脚本的参数个数。$所有参数列表每个参数作为独立字符串类似‘1’ ‘2’ ‘3’$*所有参数列表所有参数作为一个字符串类似‘1 2 3’$-当前 Shell 选项$_上条命令的最后一个参数3.3 变量操作3.3.1 变量赋值# 基本赋值varvalue# 无空格varvalue# 错误有空格varvalue with spaces# 包含空格的值# 命令输出赋值now$(date)# 推荐方式nowdate# 旧式写法# 算术运算赋值count$((105))((count105))# 另一种方式# 默认值赋值var${other_var:-default}# 如果other_var未设置或为空使用defaultvar${other_var:default}# 如果other_var未设置或为空设置为defaultvar${other_var:?错误信息}# 如果other_var未设置或为空显示错误并退出var${other_var:alternate}# 如果other_var已设置使用alternate# 位置参数赋值set-- arg1 arg2 arg3# 设置位置参数first$1# $1, $2, $3...3.3.2 变量引用只要在变量名前面加美元符号即可变量名外面的花括号是可选的加不加都行加花括号是为了帮助解释器识别变量的边界。nameAlice# 正确引用echoHello,$nameechoHello,${name}# 避免混淆的情况fruitappleechoI have${fruit}s# 正确applesechoI have$fruits# 错误引用不存在的变量fruits3.3.3 只读变量只读变量只允许读取变量的值不允许再次赋值。readonlyPI3.14159PI3.14# 报错read-only variable# 函数中的只读变量readonly-ffunction_name3.3.4 删除变量使用 unset 命令可以删除变量删除变量后该变量将无法再被使用unset 命令不能删除只读变量。unsetname# 删除变量3.4 变量作用域变量根据作用范围的大小主要分为局部变量、全局变量局部变量在Shell脚本中的函数内显示使用local关键字定义的变量。其作用域局限于函数内当local变量名与global变量名同名时使用的是local关键字定义的局部变量。# 默认在函数内定义的是全局变量functiondemo(){localvar1local# 局部变量var2global# 全局变量}demoecho$var1# 空值局部变量不可访问echo$var2# 输出global全局变量一般在Shell脚本的函数外定义当然也可以在函数内不使用local关键字申明来定义全局变量。 全局变量仅在当前Shell脚本中有效其他Shell脚本进程不能访问其作用域从全局变量定义的位置如果是在函数中定义的全局变量则是从函数被调用时执行变量定义的地方开始到脚本结束或被显示删除的地方为止。nametom## 函数外定义的全局变量nameweight50kg## 函数外定义的全局变量weightfunctiontest(){localnamejack## 函数内定义的局部变量namesexman## 函数内定义的全局变量sexage25## 函数内定义的全局变量agelocalage18## 函数内定义的局部变量ageage20## 这里其实是重新给local定义的局部变量age重新赋值echotest() name is${name}## 对应6中的结果函数内部定义了局部变量name所以获取到的是函数内定义的局部变量name的值echotest() weight is${weight}## 对应7中的结果函数内没有定义局部变量weight所以使用的是全局变量weight的值echotest() age is${age}## 对应8中的结果获取到的是最新赋值后的局部变量值}functiontest2(){age30## 函数内定义的全局变量ageechotest2() get sex is:${sex}}echoname is${name}## 对应1中的结果拿取的是函数外定义的全局变量name的值echoweight is${weight}## 对应2中的结果拿取的是函数外定义的全局变量weight的值echoage is:${age}## 对应3中的结果由于此时两个函数都未被调用所以获取不到函数中定义的age变量的值test2## 对应4中的结果由于全局变量sex是在test函数中定义的此时test函数未被调用所以获取不到sex变量的值echoage is:${age}## 对应5中的结果由于在test2函数执行后会创建一个全局变量age所以此时获取到的变量age的值为30testechoage is:${age}## 对应9中的结果由于test方法执行后重新创建一个全局变量age并赋值为25所以此处获取到的是重新创建的全局变量age的值test2## 对应10中的结果由于test函数执行后会创建一个全局变量sex所以此时再次执行后就可以获取到test函数中创建的全局变量sex的值echoage is:${age}## 对应11中的结果test2函数执行后会重新创建一个值为30的全局变量age此时再次获取到的是新创建的age的值四、Shell 字符串4.1 字符串定义方式字符串是shell编程中最常用最有用的数据类型字符串可以用单引号也可以用双引号也可以不用引号。4.1.1 单引号单引号里的任何字符都会原样输出单引号字符串中的变量是无效的单引号字串中不能出现单独一个的单引号对单引号使用转义符后也不行但可成对出现作为字符串拼接使用。strhello worldecho$str# 输出hello worldstr1Hello $USERecho$str1# 输出Hello $USER4.1.2 双引号双引号里可以有变量双引号里可以出现转义字符。nameTomstrHello, I am\$name\! echo$str# 输出Hello, I am Tom!str2Hello$USERecho$str2# 输出Hello root或当前用户名4.1.3 常见的转义字符echoLine 1\nLine 2# \n 换行echoTab\tseparated# \t 制表符echoBackslash:\\# \\ 反斜杠echoQuote:\# \ 双引号4.2 字符串基本操作4.2.1 获取字符串长度strHello Worldecho${#str}# 输出114.2.2 字符串拼接str1Hellostr2World# 方法1直接拼接result$str1$str2echo$result# Hello World# 方法2使用运算符greetingHellogreeting Worldecho$greeting# Hello World4.2.3 字符串截取str0123456789# 从指定位置开始截取echo${str:2}# 23456789从索引2开始echo${str:2:4}# 2345从索引2开始取4个字符# 负数索引需要bash 4.2echo${str:-4}# 6789从倒数第4开始echo${str:-4:2}# 674.3 字符串查找与替换4.3.1 查找子字符串位置strhello world hello# 使用 expr兼容性好exprindex$strworld# 输出7w的位置# 使用 grep获取行号echo$str|grep-b-oworld# 输出6:world4.3.2 替换操作strapple banana apple# 替换第一个匹配echo${str/apple/orange}# orange banana apple# 替换所有匹配echo${str//apple/orange}# orange banana orange# 前缀匹配替换path/usr/local/binecho${path#/usr}# /local/bin删除最短匹配echo${path##/usr}# /local/bin# 后缀匹配替换filebackup.tar.gzecho${file%.*}# backup.tar删除最短后缀echo${file%%.*}# backup删除最长后缀4.4 字符串分割4.4.1 按分隔符分割为数组strapple,banana,cherry# 设置分隔符IFS,read-rafruits$strecho第一个水果:${fruits[0]}# appleecho所有水果:${fruits[]}# apple banana cherry4.4.2 使用awk分割strJohn:Doe:30echo$str|awk-F:{print $1}# Johnecho$str|awk-F:{print $2}# Doe4.5 字符串比较4.5.1 比较运算符str1hellostr2world# 相等比较if[$str1$str2];thenecho相等elseecho不相等fi# 不等比较if[$str1!$str2];thenecho不相同fi# 按字典序比较if[[$str1$str2]];thenecho$str1在$str2之前fi4.5.2 检查空字符串strif[-z$str];thenecho字符串为空fiif[-n$str];thenecho字符串非空fi4.6 字符串格式化4.6.1 printf 格式化输出nameAliceage25# 基本格式化printfName: %s, Age: %d\n$name$age# 宽度和对齐printf%-10s %5d\n$name$age# 左对齐printf%10s %5d\n$name$age# 右对齐# 小数格式化pi3.1415926printfPI: %.2f\n$pi# 保留两位小数4.6.2 填充和截断strHello# 左侧填充printf%10s\n$str# Hello# 右侧填充printf%-10s\n$str# Hello # 固定长度截断printf%.3s\n$str# Hel五、Shell 数组5.1 数组的定义用括号来表示数组数组元素用空格符号分割开数组元素的下标由 0 开始编号。下标可以是整数或算术表达式其值应大于或等于 0可以不使用连续的下标而且下标的范围没有限制。array_name(value0 value1 value2 value3)或者array_name(value0 value1 value2 value3)5.2 数组的声明与初始化# 方法1直接初始化fruits(applebananacherry)# 方法2逐个元素赋值colors[0]redcolors[1]greencolors[2]blue# 方法3使用declare命令declare-anumbersnumbers(12345)# 方法4从命令输出初始化files(*.txt)# 所有txt文件lines($(catfile.txt))# 文件内容会被空格分割5.3 数组的基本操作5.3.1 访问数组元素fruits(applebananacherry)# 访问单个元素echo${fruits[0]}# appleecho${fruits[1]}# banana# 访问所有元素echo${fruits[]}# apple banana cherryecho${fruits[*]}# apple banana cherry5.3.2 获取数组长度fruits(applebananacherry)# 数组元素个数echo${#fruits[]}# 3echo${#fruits[*]}# 3# 单个元素的长度echo${#fruits[0]}# 5apple的长度5.3.3 获取数组索引fruits(applebananacherry)# 获取所有索引echo${!fruits[]}# 0 1 2echo${!fruits[*]}# 0 1 25.4 数组的修改与操作5.4.1 添加元素fruits(applebanana)# 方法1指定索引fruits[2]cherry# 添加第三个元素# 方法2添加到末尾fruits(orange)# fruits(apple banana cherry orange)fruits(grape peach)# 添加多个元素# 方法3插入到指定位置需要重新构建fruits(${fruits[]:0:1}kiwi${fruits[]:1})# 结果apple kiwi banana cherry orange grape peach5.4.2 删除元素fruits(applebananacherryorange)# 删除指定元素留下空位unsetfruits[1]# 删除bananaecho${fruits[1]}# 空echo${fruits[]}# apple cherry orange# 重新索引数组fruits(${fruits[]})echo${fruits[1]}# cherry# 删除整个数组unsetfruits5.4.3 更新元素fruits(applebananacherry)# 直接赋值修改fruits[1]blueberryecho${fruits[]}# apple blueberry cherry5.5 数组的遍历colors(redgreenblueyellow)# 方法1使用索引foriin${!colors[]};doecho索引$i:${colors[$i]}done# 方法2直接遍历值forcolorin${colors[]};doecho颜色:$colordone# 方法3C风格for循环for((i0;i${#colors[]};i));doechocolors[$i] ${colors[$i]}done5.6 数组切片numbers(0123456789)# 语法${数组名[]:起始位置:长度}echo${numbers[]:2:3}# 2 3 4echo${numbers[]:5}# 5 6 7 8 9从索引5到末尾echo${numbers[]:-3:2}# 7 8倒数第3个开始取2个5.7 数组与字符串的转换5.7.1 字符串拆分为数组# 按空格分割strapple banana cherryfruits($str)echo${#fruits[]}# 3# 按特定分隔符分割使用IFSdataJohn,Doe,30,New YorkIFS,read-raperson$dataecho姓名:${person[0]}${person[1]}echo年龄:${person[2]}echo城市:${person[3]}# 使用readarray/mapfileBash 4.0readarray-tlinesfile.txtecho共${#lines[]}行5.7.2 数组合并为字符串fruits(applebananacherry)# 方法1使用*IFS第一个字符作为分隔符IFS,echo${fruits[*]}# apple,banana,cherryunsetIFS# 恢复IFS# 方法2使用printfprintf%s,${fruits[]}|seds/,$/\n/# apple,banana,cherry# 方法3使用循环resultforfruitin${fruits[]};doresult$fruit,doneresult${result%,}echo$result# apple,banana,cherry