当前位置: 首页 > Linux

Shell脚本全攻略:一次小测试

时间:2023-04-06 01:55:58 Linux

Shell简介整个系列的博客都使用Bash,这是大多数GUN/Linux系统默认的shell环境,所以大部分案例和讨论都是在这个基础上进行的。用户分类$表示普通用户#表示管理员用户rootshebangshell脚本通常是以shebang开头的文本文件,如#!/bin/bashUnix行话,用sharp或hash来调用#,用bang变成!/bin/bash表示Bash解释器命令的位置,当然也可以使用其他解释器。Linux内核会自动读取第一行并注意到#!/bin/bash,运行/bin/bash来执行脚本。运行脚本为bash命令行参数bashscript.sh授予脚本执行权限,成为可执行文件的相对路径chmoda+xscript.sh./script.sh绝对路径chmoda+xscript.sh/主页/路径/脚本。sh命令终端打印终端是一个交互工具,用户可以通过它与shell环境进行交互,打印是最基本的任务。echo命令使用规则默认情况下,echo会在每次调用后添加一个换行符当使用不带引号的echo时,不能在要显示的文本中使用分号;因为分号作为命令分隔符使用双引号时,遇到特殊字符需要转义字符转义,而在单引号中,变量替换在单引号中是无效的,比如${username}等转义字符awarnsbdelete前一个字符c没有在末尾添加换行符fnewline但是光标保持在原来的位置nnewline并且光标移动到行首r光标移动到行首但是没有notchangethelinetinsertstabvsameasfinsertsnnninsertsnnn(八进制表示的ASCII字符常用选项)可以使用直接输出命令结果可以使用-n选项忽略末尾的换行符可以使用-e选项在echo中转义换行符打印彩色输出文本闪烁0关闭所有属性1设置高亮度(粗体)2Fade3Italic4Underline5Blink7Invert8ColorReset=0,Black=30,Red=31,Green=32,黄色=33,蓝色=34,洋红色=35,青色=36,白色=37背景颜色重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红色=45,cyan=46,white=47demo[root@localhost]$echo-e"e[1;31m字为红色e[0m"字为红色[root@localhost]$echo-e"e[1;42m背景为绿色e[0m"字为绿色[root@localhost]$echo-e"e[1;42;31m字为红色,背景为绿色e[0m"字为红色,背景为绿色[root@localhost]$echo-e"e[5;37;31mMySQL服务器停止...e[0m"MySQL服务器停止...[root@localhost]$echo-e"e[4;37;31mMySQL服务器停止...e[0m"MySQL服务器停止...printf命令使用规则默认情况下,printf不会像echo一样自动添加换行符,必须手动添加换行符替换字符%s字符串%cASCII字符%d十进制整数%f浮点对齐格式-不指定左对齐,默认为右对齐你可以在对齐符号后加一个数字来表示宽度对于浮点数,你可以使用其他参数选择小数部分,如%-4.2f示例演示[root@localhost]$printf"%-5s%-10s%-4.2fn"1escape100.1231escape100.12变量和环境变量是任何编程都必须的语言存储各类数据不可或缺的组件在Bash中,每个变量的值都是一个字符串。无论赋值时是否使用引号,值都会以字符串的形式存储。环境变量用来存放一些特殊的Value变量查看环境变量所有终端相关的env命令只针对进程cat/proc/$PID/environ默认以0分隔,可以使用tr命令转换使用变量定义变量var=value使用变量echo$varecho${var}添加PATH变量路径PATH变量通常定义在/etc/envitonment或/etc/profile或~/.bashrcexportPATH="$PATH:/home/escape/bin"该变量的作用是获取字符串长度length=$(#var)标识当前使用的shellecho$SHELLecho$0检查是否是超级用户[$UID-ne0]修改bash提示符echo$PS1PS1='${debian_chroot:+($debian_chroot)}u@h:w$'可以使用e[1;31等特定的转义字符来设置颜色提示字符串使用函数添加环境变量在~/.bashrctoprepend(){[-d"$2"]&&eval$1="$2':'$$1"&&export$1;}判断第二个参数指定的目录是否存在,将第一个参数指向的变量值设置为第二个参数的值加上:$1使用方法prependPATH/opt/myapp/bin环境变量prepend(){[-d$2]&&eval$1="$2${$1+':'$$1}"&&export$1;}#其中$1不为空时,使用表达式':'$$1#$$1表示第一个参数的实际值示例演示[root@localhost]$pgrepgedit12501[root@localhost]$cat/proc/12501/environ[root@localhost]$cat/proc/12501/environ|tr'0''n'bash[root@localhost]$count=5[root@localhost]$fruit=apple[root@localhost]$echo"Wehava$count${fruit}(s)"Wehave5apple(s)[root@localhost]$echo'$var'将打印$var$var将打印$varbash[root@localhost]$echo$PATH/usr/local/var/pyenv/shims:/usr/local/bin[root@localhost]$exportPATH="$PATH:/home/escape/bin"[root@localhost]$PATH="$PATH:/home/escape/bin"[root@localhost]$exportPATH[root@localhost]$echo$PS1${ret_status}%{$fg[cyan]%}%c%{$reset_color%}$(git_prompt_info)进行数学运算在Bashshell环境下,可以使用let、())、[]进行基本算术运算,使用expr、bc进行高级运算基本算术letlet结果=num1+num2letnum++letnum--letnum+=5letnum-=5$(())result=$((num1+num2))result=$(($num+5))$[]result=$[num1+num2]result=$[$num+5]高等算术exprresult=expr3+4result=$(expr$num+5)bccommonusageecho"4*0.56"|bc设置小数精度echo"scale=2;3/8"|bc十进制转二进制echo"obase=2;$num"|bc二进制转十进制echo"obase=10;ibase=2;$num"|bc平方根echo"sqrt(100)"|bc计算平方回波"10^10"|bc脚本判断条件要想写好一个shell脚本,需要熟悉以下判断条件和规则逻辑判断!Logicalnon-aLogicaland-o逻辑或语句判断解释[-efile]#如果文件存在则为真[-dfile]#如果文件存在且是目录则为真[-ffile]#如果文件存在且为普通文件则为真[-bfile]#如果文件存在且为目录则为真块特殊文件[-sfile]#如果文件存在且大小不为0则为真[-c文件]#如果文件存在且为字特殊文件则为真[-h文件]#如果文件存在且为符号文件则为真link[-pfile]#Trueiffileexistsandisanamedpipe[-rfile]#Trueiffileexistsandisreadable[-wfile]#Trueiffileexistsandiswritable[-xfile]#Trueif文件存在且可读fileexistsandisexecutable[-Lfile]#Trueiffileexistsandisasymboliclink[-Sfile]#Trueiffileexistsandisasocket[-Ofile]#TrueiffileexistsandisavaliduserID[-Gfile]#Trueiffileexistsandisavalidusergroup[-tFD]#TrueifthefiledescriptorFDisopenandpointstoaterminal[-ufile]#Trueiffileexistsandisavalidusergroup(setwithchmodu+s)[-gfile]#如果文件存在并且设置了SGID(setwithchmodg+s)istrue[-kfile]#Iffileexistsandthestickybithasbeenset(setwithchmoda+t),则为真条件表达式解释[string]#string如果长度不为零则为truenon-zero[-nstring]#string如果长度为非零则为truenon-zero[-zstring]#如果长度为零则字符串为真[sting1==string2]#如果2个字符串相同则为真[string1!=string2]#如果2个字符串不相等则为真[string1–eqstring2]#等于true[string1-nestring2]#不等于True[string1-lestring2]#小于true[string1–gtstring2]#大于true[string1–gestring2]#大于等于true[file1–ntfile2]#如果file1比file2新或者file1存在而file2不存在则为true[file1–otfile2]#如果file1比file2旧或者file2存在andfile1doesnotexistTrue[file1–effile2]#如果file1和file2指向相同的设备和节点号则为True文章作者:Escape文章链接:https://www.escapelife.site/p...