Shell脚本⼊门shell 字符串长度
Shell script(Shell脚本)的⼯作⽅式有两种:
①交互式(Interactive):⽤户每输⼊⼀条命令,然后Shell⽴即执⾏⼀次;
②批处理(Batch):由⽤户实现编写好⼀个完整的Shell脚本,Shell会⼀次性执⾏脚本中诸多的命令。
查看系统可⽤的shell(/etc/shells⽂件)
Linux系统默认的命令⾏终端解释器为Bash
Shell脚本⽂件的格式:
1. 第⼀⾏(⼀般必须写明):指定脚本使⽤的shell(若不写明也不影响脚本的执⾏,系统会⾃动以sh解析脚本)。"#!/bin/bash"声明⽂
件内的语法使⽤bash的语法,当这个程序被执⾏时,加载bash的相关环境配置⽂件(⼀般是non-login shell中的~/.bashrc⽂件)。2. 第⼆部分的注释(可写):程序内容的说明。shell脚本中,井号#⽤作批注(除第⼀⾏的"#!"外),shell不会解释以#开头的⾏(除第
⼀⾏bash声明外)。
3. 主要环境变量的声明(可写)
4. 脚本的程序部分。
5. 程序执⾏结束,回传⼀个数值给系统告知执⾏的结果(可写。默认命令执⾏成功返回数值0)。
脚本⽂件test1.sh的执⾏⽅式:
1. 以sh(bash)进程来执⾏脚本⽂件(⽤户不必拥有对脚本⽂件的x权限)(在⼦进程中执⾏)
sh -x:实现shell脚本逐条语句的跟踪
sh -n:不执⾏脚本,仅进⾏语法的检查
sh -v:执⾏脚本前,先将脚本的内容输出到屏幕上
2. 通过绝对或相对路径来执⾏脚本⽂件(⽤户须拥有对脚本⽂件的x权限)
(Linux系统中⼀切都是⽂件。后缀名.sh仅提⽰⽤户该⽂件是⼀个脚本⽂件,并不代表该⽂件是可以被⽤户执⾏的。⽂件是否可以被执⾏在于⽤户是否拥有对该⽂件的x权限)(在⼦进程中执⾏)
3. 将脚本⽂件所处的⽬录添加到PATH环境变量中,通过输⼊脚本⽂件名来直接运⾏(⽤户须拥有对脚本⽂件的x权限)(在⼦进程中执
⾏)
4. 通过source命令或⼩数点(.)来执⾏脚本⽂件(在⽗进程中执⾏)
⽤⽅式①/②/③执⾏test2.sh脚本,执⾏完成后回到命令⾏模式(⽗进程)输出脚本中设置的变量,发现变量并不存在
(通过上述①/②/③⽅式(bash(sh)、绝对/相对路径或者将路径添加到$PATH中)来运⾏脚本时,该script会使⽤⼀个新的bash环境(⼦shell、⼦进程)来执⾏脚本内的命令。当⼦进程完成后(脚本执⾏结束),⼦进程内的各项变量或操作将会消失⽽不会传回给⽗进程中。)
若通过source命令或⼩数点(.)来执⾏脚本,该script会在⽗进程中执⾏。因此,⽗进程拥有脚本内设置的变量、操作等。
bash shell中的数学运算:在⽅括号内计算数学公式 [ operation ],结果赋值为result=$[ operation ]。
数学运算浮点解决⽅案:使⽤bc命令(bash的内建计算器)。
选项作⽤
-q不显⽰bc计算器的欢迎信息
输⼊quit或组合键ctrl+d可退出bc计算器
浮点运算是由内建变量scale(数值范围)控制的,须将这个值设置为希望在计算结果中保留的⼩数位数,默认值为0。
在脚本中使⽤bc命令,通过命令替换$(),将输出结果赋值给⼀个变量:
基本格式为 variable=$(echo "options; expression" | bc)
使⽤内联输⼊重定向<<,在命令⾏中重定向数据(特别适⽤于进⾏⼤量运算):
基本格式为 varible=$(bc << EOF
options
statements
expressions
EOF
)
EOF字符串标识了重定向给bc命令的数据的终⽌。
bash计算器中创建的变量只在bash计算器中有效。
Shell中运⾏的每个命令都使⽤退出状态码告诉shell它运⾏完毕。退出状态码:0-255的整数值,在命令结束运⾏时由命令传给shell。变量$?⽤于保存上个已执⾏命令的退出状态码。退出状态码可配合exit命令使⽤。
状态码描述
0命令成功结束
1⼀般性未知错误
2不适合的shell命令
126命令不可执⾏
127没到命令
128⽆效的退出参数
128+x与Linux信号x相关的严重错误
130通过ctrl+c终⽌的命令
255正常范围之外的退出状态码
Shell script的的默认变量(接受⽤户参数的变量)
$0:当前Shell脚本程序的名称;
$#:参数的个数;
$*:所有位置的参数值;
$?:上⼀条命令的执⾏返回值;
$1、$2、$3……:第N个位置的参数值。
test(测试):判断条件表达式是够成⽴。格式:test [参数]。单独执⾏test命令后不会显⽰任何信息。
可通过echo $?输出上⼀条命令(test命令)执⾏后的返回结果,若为0则表⽰执⾏(判断)成功
或通过&&、||来显⽰相关结果
⽂件测试所⽤的参数
操作符作⽤
-e file1测试file1⽂件是否存在(exist)
-d file1测试file1⽂件是否为⽬录类型,且是否存在(directory)
-f file1测试file1⽂件是否为⼀般⽂件,且是否存在(file)
-r file1测试当前⽤户对file1⽂件是否有读取权限(read)
-w file1测试当前⽤户对file1⽂件是否有写⼊权限(write)
-x file1测试当前⽤户对file1⽂件是否有执⾏权限(e x ecute)
file1-nt file2测试file1是否⽐file2新(newer than)(检查⽂件⽇期)
file1-ot file2测试file1是否⽐file2旧(older than)
整数测试所⽤的参数
操作符作⽤
n1 -eq n2检查n1是否等于n2(equal)
n2 -ne n2检查n1是否不等于n2(not equal)
n1-gt n2检查n1是否⼤于n2(greater than)
n1 -lt n2检查n1是否⼩于n2(less than)
n1 -le n2检查n1是否等于或⼩于n2(less equal)
n1 -ge n2检查n1是否⼤于或等于n2(greater equal)
Shell中不应使⽤"=="和"!="进⾏整数的⽐较(会将整数当作字符串来⽐较)
字符串测试所⽤的参数
操作符作⽤
str1 == str2⽐较str1与str2字符串的内容是否相同
str1 != str2⽐较str1与str2字符串的内容是否不同
-z str1判断str1字符串长度是否为0(或未被定义)
-n str1判断str1字符串长度是否为⾮0
str1 > str2判断str1是否⽐str2⼤(逐位⽐较字符串的每个字符,按字典顺序⽐较⼤⼩)
str1 < str2判断str1是否⽐str2⼩
(使⽤>、<(⼤于号、⼩于号)进⾏判断时必须搭配转义字符/使⽤,否则shell会误认为是重定向符号,把后字符串误当成⽂件名)(⽐较字符串顺序⼤⼩的测试中,⼤写字母会被认为是⼩于⼩写字母的(与sort命令恰恰相反,在英语环境下sort命令会认为⼤写字母是⼤于⼩写字母的,即排序结果中⼩写字母优先于⼤写字母出现))
多重条件判断
操作符作⽤
test1 -a test2类似于&&,两个测试条件同时成⽴时才回传true(and)
test1 -o test2类似于||,任⼀测试条件成⽴就回传true(or)
! test1反向状态(取反)
[](中括号):判断符号。bash shell提供的另⼀种条件测试⽅法,作⽤同等与test命令,常⽤于if…then条件判断式中。
中括号的两端、每个组件间都需要有空格符来分隔。
中括号内的变量、常量,最好都以双引号或单引号括起来。
[ "$yn" == "Y" -o "$yn" == "y" ] 也可写成 [ "$yn" == "Y" ] || [ "$yn" == "y" ] (布尔逻辑能将可能的返回值简化为TRUE或FALSE类型)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。