shell脚本白话知识点(原创)

文章手写拼打,内容当然不是本人所创造,目的是用白话更好的记录并理解SHELL脚本,加以运用!

   !(感叹号)不能用双引号打印出来,只能用单引号来打印输出。但是在bash环境下,要输出感叹号必须使用单引号。这是因为默认情况下开启了使用感叹号引用内存中的历史命令的设置,可以使用set +H关闭该设置,这时可以使用感叹号输出。(done)

如果echo不加任何引号,很显然不能输出分号“;”,因为分号会被shell解析为命令连接符号。如果;不作为换行符需要加上“”
但只加单引号又不能扩展变量,使用双引号又不好输出感叹号,所以echo命令克服各种疑难杂症的方法是对特殊符号分开引用。
echo -e识别转义和特殊意义的符号,如换行符、n、制表符\t、转义符\等。
不加-n的默认情况下echo会在每行行尾加上换行符号,使用echo -n取消分行输出。(done)

echo可以控制字体颜色和背景颜色输出。
常见的字体颜色:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,紫色=35,天蓝色=36,白色=37。
常见的背景颜色:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,紫色=45,天蓝色=46,白色=47。
字体控制选项:1表示高亮,4表示下划线,5表示闪烁等。
因为需要使用特殊符号,所以需要配合-e选项来识别特殊符号。(done)

使用printf可以输出更规则更格式化的结果。它引用于C语言的printf命令,但是有些许区别。
使用printf可以指定字符串的宽度、实现左对齐(使用减符号-)、右对齐(默认的)、格式化小数输出等。
使用printf最需要注意的两点是:
(1)printf默认不在结尾加换行符,它不像echo一样,所以要手动加“\n”换号;
(2)printf只是格式化输出,不会改变任何结果,所以在格式化浮点数的输出时,浮点数结果是不变的,仅仅只是改变了显示的结果。(done)

Linux中可以使用分号“;”、双and号“&&”和双竖线“||”来连接多个命令。单"&"符号也算命令连接符号,只不过它是将其前面的命令放入后台执行,所以可以变相地实现命令并行执行。
分号:命令之间没有逻辑关系。分号连接的命令会按照顺序从前向后依次执行,但分号两端的命令之间没有任何逻辑关系,所有写出来的命令最终都会被执行,即使分号前面的命令出错也不影响后面的命令。(done)

&&and符号:逻辑与。&&连接的命令会按照顺序从前向后执行,但只有当command1正确执行才执行command2,如果command1不正确执行,则不执行command2。在bash中,通过预定义变量“$?”来判断命令是否正确执行,如果"$?"的值为0则表示前一条命令正确执行,其他任意值都表示不正确执行。(done)

逻辑或。||连接的命令会按照顺序从前向后执行,但只有当command1不正确执行才执行command2,command1正确执行则不会执行command2。||和&&都是短路符号,符号左右的命令之间具有逻辑关系。
总结:分号在两个命令执行的时候没有逻辑关系,无论失败成功都会执行,&&and符号只有前一个命令正确,后面的才会执行。||双竖线只有前一个命令不正确,执行失败才会跟着执行第二个命令。
分号 两个命令都会执行。命令连接之间无逻辑关系
&& 第一个正确才执行第二个。命令连接之间有逻辑关系
||第一个失败才执行第二。命令连接之间有逻辑关系(done)

当对变量本身进行操作,则不使用$,当对变量值进行操作,则使用$。(done)

脚本语言是弱类型的语言,变量通常不需要特地声明甚至不需要初始化,在脚本运行时由解释器进行解释运算,解释器知道变量在什么时候是什么类型,所以直接赋值使用即可。bash中,变量默认都是字符串类型,不论是否使用引号赋值,都以字符串方式存储。(done)

unset str --- unset是释放变量, str前面不加¥
临时将普通变量升级为环境变量: export str 或者赋值时 export str="value" ,这样$str就可以在当前shell和子shell中使用,但是退出脚本或者重新登录shell都会取消export效果。(done)

定义只读变量: readonly str 。这时将无法修改变量值也无法unset变量,只有重新登录shell才能继续使用只读变量。(done)

在使用"${}"方式引用变量时,变量名前加上#就可以查看该变量的字符长度。空格也算入长度(done)

declare [-aixr] variable 定义变量类型 declare -x 是变为环境变量(done)

位置变量和特殊变量
$?:上一条代码执行的回传指令,回传0表示标准输出,即正确执行,否则为标准错误输出。
$$:当前shell的PID。除了执行bash命令和shell脚本时,$$不会继承父shell的值,其他类型的子shell都继承。
$BASHPID:当前shell的PID,这和"$$"是不同的,因为每个shell的$BASHPID是独立的。而"$$"有时候会继承父shell的值。
$!:最近一次执行的后台进程PID。
$#:统计参数的个数。
[email protected]:所有单个参数,如"a""b""c""d"。
$*:所有参数的整体,如“abcd”。
$0:脚本名。
$1……$n:参数位置。(done)

变量赋值等:
${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则展开为parameter的值;
${parameter-word}:和${parameter:-word}几乎等价,除了parameter设置了但为空时,变量的结果将是null,而非word。在/etc/init.d/httpd中有此用法。
${parameter:+word}:如果parameter为空或未定义,不做任何操作,即仍然为空;否则展开为“word”值;
${parameter:=word}:如果parameter为空或未定义,则变量赋值(注意是赋值,不是展开)为“word”,否则为parameter自身;
${parameter=word}:在man bash里没有该定义,但是经测试,等价于${para:=word}。
${parameter:offset}:取子串,从offset处的后一个字符开始取到最后一个字符;
${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;(done)

配置文件中的变量值可以在脚本中被使用
要在脚本中调用配置文件,直接使用 source config_file 或 . config_file
服务启动脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件(done)

scale=4 意思是计算的时候保留四位小数 scale 保留小数位数 也是保留小数点(done)

bc << EOF 反向重定向 EOF是把输入结果给BC命令来执行(done)

echo $? 是SHELL脚本的结束验证码 脚本执行成功的话得到的整数是0 如果脚本执行失败 那么就是除了0之外的整数。(done)

LINUX $? 退出状态码
0 命令成功结束
1 一般性未知错误
2 不适合的SHELL命令
126 命令不可执行/执行错误的命令
127 没找到命令
128 无效的退出参数
128+X 与LINUX信号X相关的严重错误
130 通过CTRL+C终止的命令
225 正常范围之外的退出状态码(done)

结构化命令允许你改变程序执行的命令!
if 命令
then 命令
fi --可以理解为 如果。。就。。 当然if 后接的命令要成功执行。 才会接着执行then后面的。
if 命令;then
命令
fi ---命令后面加分号 可以让then放在同一行 只是格式会更好看点
if then fi then 后面可以执行多条命令。前提是if 返回值为0即执行成功。(done)

if(执行一个命令)
then(第一个命令执行成功则执行这里)
else(第一个命令执行不成功则执行这里)
fi(语句结束) ---if-then-else (done)

-n 和 -z 可以检查一个变量是否含有数据(done)

for var in list
do
commands
done

for循环无非注意点格式, 把 ‘ 单引号要转义或者用双引号括起来。
特殊的环境变量 内部字段分隔符 IFS=¥‘\n’ 意思IDS是脚本内只识别换行符,其它空格符 制表符不识别。(done)

IFS.OLD=$IFS
IFS=$‘\n‘
<使用新的IFS值>
IFS=$IFS.OLD 这样保证大脚本环境 后续使用的是默认的IFS值
IFS=$‘\n‘:;" 这样是在脚本中 把分号 冒号 双引号 也当字段分隔符来赋值(done)

C语言的for循环
for (( i=1; i<=100; i++ ))
do
echo "this number is next $i"
done
until 当执行的$0返回值不为0 则停止循环
break 执行到break则结束循环 break n n=执行的循环数(done)

循环是编程的一部分。bash shell提供了三种可用于脚本中的循环命令。
(1)for命令允许你遍历一系列的值,不管是在命令行里提供好的、包含在变量中的还是通过文件扩展匹配获得的文件名和目录名。
(2)while命令使用普通命令或测试命令提供了基于命令条件的循环。只有在命令(或条件)产生退出状态码0时,while循环才会继续迭代指定的一组命令。
(3)until命令也提供了迭代命令的一种方法,但它的迭代是建立在命令(或条件)产生非零退出状态码的基础上、这个特性允许你设置一个迭代结束前都必须满足的条件。
(4)可以在shell脚本中对循环进行组合,生成多层循环。bash shell提供了continue和break命令,允许你根据循环内的不同值改变循环的正常流程。
(5)bash shell还允许使用标准的命令重定向和管道来改变循环的输出。你可以使用重定向来将循环的输出重定向到一个文件或是另一个命令。这就为控制shell脚本执行提供了丰富的功能。(done)

basename命令会返回不包含路径的脚本名。
比如 bash /home/dp/dp.sh
this file is /home/dp/dp.sh 怎么得到文件名不得到路径呢?
cat dp.sh
name=$(basename $0)
echo the file is:$name(done)

$0 是程序名 也是 文件名 属于特殊变量
$# 是特殊变量,加在脚本里,可以得出执行脚本后加的参数总量。
列: cat dp.sh
this dp $# fiel
./dp.sh 1 2 3 4 5 6
this dp 5 file
${!#)} 特殊变量加花括号也是测试脚本执行了几个参数的命令
[email protected] 和 $* 都是特殊变量:
(1)[email protected]会单独的处理每个参数。
(2)$* 会把所有参数当成单个参数来处理数据。
列: dp.sh 5 4 3 2 1
$*=5 4 3 2 1
[email protected]=5 [email protected]=4 [email protected]=3 [email protected]=2 [email protected]=1 (done)

shift命令(特殊变量)
使用此命令会对参数进行向
shitf 2
echo "number file: $1"
./dp.sh 1 2 3 4 5 左移动 $0不会移动
列:cat dp.sh
echo "the file is:$*"
the file is: 1 2 3 4 5
number file: 3
以上使用shift2 将执行参数向左移动2位,这样就轻松的跳过了不需要的参数了!(done)

-- 双破折号 是把参数和选项分隔开来
列: -d) this number -d dp
-c ) this number -c dp
--) shift
break ;;
重定向:
0 stdin 标准输入
1 stdout 标准输出
2 stderr 标准错误
列子:ll 2>dp.txt 1>dp1.txt 重定向对应输出到对应文件
ll &>dp.txt 是无论错误正确都输入到此文件中 但是这种缺点是不方便查看错误信息,全部混合在一起。还是分开来更好。(done)

exec
exec 命令告诉shell在脚本执行期间,重定向某个特定文件描述符。
例:exec 1>dp.txt

#将文件中的内容清空
cat /dev/null > testfile
#重定向写入的输出teeecho "the sun" | tee $file (done)

原文地址:https://www.cnblogs.com/Michaelblue/p/11441874.html

时间: 2024-10-13 14:37:47

shell脚本白话知识点(原创)的相关文章

Shell脚本编程知识点总结及范例

 一:关于语言 1)编译性语言 编译型语言多半运作于底层,所处理的是字节.整数.浮点数或其它及其机器层经的对象.处理过程为:源程序--预处理--编译--汇编--链接,编译性语言为静态语言. 2)解释性语言 解释性语言读入程序代码并将其转化为内部的形式加以执行.处理过程:解释性(文本文件)-解释器去读取并执行.解释性语言为动态语言. 二:基础 变量类型 linux脚本中的变量不需要事先声明,而是直接定义使用(这点不同于其他高级编程语言中变量的使用)bash变量类型分为本地变量和环境变量. 本地变量

老男孩教育每日一题-第69天-shell脚本知识点:linux系统脚本中trap信号都有哪些,如何进行使用?

题目 shell脚本知识点:linux系统脚本中trap信号都有哪些,如何进行使用? 参考答案: [trap信号命令说明] trap命令用于指定在接收到信号后将要采取的行动,trap命令的一种常见用途是在脚本程序被中断时完成清理工作.历史上,shell总是用数字来代表信号,而新的脚本程序应该使用信号的名字,它们保存在用#include命令包含进来的signal.h头文件中,在使用信号名时需要省略SIG前缀.可以在命令提示符下输入命令trap -l来查看信号编号及其关联的名称. [trap信号命令

linux学习—shell脚本知识点总结

Shell脚本 --Shell脚本有点像早期的批处理文件,将一些命令汇总起来一次执行,但Shell有更强大的功能,可以类似于程序的编写,不需要编译就能执行,使用起来很方便,可以简化我们日常的管理工作. 目录 什么是Shell 脚本的运行方法 #!(读shabang)的作用详解 结合案例分析变量类型 特殊变量及其[email protected] $*的区别 退出状态 算数运算 test和[ expression ]判断 一.什么是Shell 我们知道管理整个计算机硬件的其实是核心(kernel)

shell脚本笔记(原创不断记录)

今天开始自己的shell脚本练习,刚好公司有太服务器,要时间对数据的cp是按月的: 考虑:首先寻找规律,发现都放置在/opt/www/aaa/  里面有很多的2级和3级目录和文件,但我追踪要备份的是年月为文件名的格式:2015_06 这样的格式,首先我们不清楚这个目录下有多少这样的2015_06的子目录所以需要统计: find /opt/www/aaa -name 2015_06 查看了下我要备份的地方#!/bi#admin fengtaotao Email:23956580@qq.com #F

老男孩教育每日一题-第95天-shell脚本知识点:书写脚本完成ftp上传下载

题目 日常工作中经常用到FTP,进行文件的共享与下载,单对于有些不熟悉FTP命令行人员使用FTP进行共享文件管理,是一件很头疼的事.而且FTP如果有些文件需要每天定时进行上传或下载,人为重复相同工作也是没有意义的因此如何编写自动下载或上传FTP文件脚本? 答案参考: 1. ftpput.sh 上传文件到ftp脚本 #!/bin/sh         #FileName:ftpput.sh     #Function:从本地客户端向ftp服务器上传一个文件       #Version:V0.1 

老男孩教育每日一题-第94天 -shell脚本知识点:对shell脚本进行加密

题目 用shell脚本对系统进行自动化维护,简单,便捷而且可移植性好.但shell脚本是可读写的,很有可能会泄露敏感信息,如用户名,密码,路径,IP等.同样,在shell脚本运行时会也泄露敏感信息.请问如何不影响脚本运行的前提下,对脚本进行加密 答案参考: 方法一:shc shc是一个加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件.shc 安装yum -y install shc使用方法:shc -r -f script-name 注意:要有-r选项, -f 后

[原创]MYSQL周期备份shell脚本

这个脚本是实现阿里云mysql数据库全量周期备份的shell脚本,实现备份数据按一周星期几分开存放.一下是脚本内容: #!/bin/bash echo `date`echo "backup begin!!!" DATE1=`date +%Y%m%d%H%M%S`DATE2=`date +%w`BACKUPDIR="/data/backup/backupdir/"BACKUPPATH="/data/backup"BACKUPNAME="/

(原创)Windows下编译的Shell脚本不能再Linux中运行的解决办法

一.原理 Windows编译的文件和Linux编译的文件格式不太一样,导致在Linux运行Shell脚本的时候会提示:/bin/bash^M: bad interpreter: 没有那个文件或目录. 原因是这样的: 1.Windows编译的文件结束时(回车+换行) 2.Linux编译的文件结束时(换行)             这样导致了Windows编译的文件放在Linux中会有[noeol]和[dos]的Flag标示. 如果运行CAT命令可以更直观的看到两个不同操作系统产生的文件差异,Win

【Shell】使用Shell脚本发布项目

第一次写Shell脚本,没经验,是直接写呢,还是要走流程( ̄▽ ̄)~* ----------------------------------------------------------------------- 总的来说分三步,下面跟我一起做 ----------------------------------------------------------------------- 第一步:先创建一个文件 touch public.sh 第二步:编写脚本 #!/bin/bash echo