shell脚本白话知识点(原创)
Posted michaelblue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。
$#:统计参数的个数。
$@:所有单个参数,如"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
$!#) 特殊变量加花括号也是测试脚本执行了几个参数的命令
$@ 和 $* 都是特殊变量:
(1)$@会单独的处理每个参数。
(2)$* 会把所有参数当成单个参数来处理数据。
列: dp.sh 5 4 3 2 1
$*=5 4 3 2 1
$@=5 $@=4 $@=3 $@=2 $@=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)
以上是关于shell脚本白话知识点(原创)的主要内容,如果未能解决你的问题,请参考以下文章