Shell脚本编程(一)
文章目录
- echo将文本字符串输出在同一行:
echo -n 输出内容
- 可以使用${variable}格式来引用变量
- 用户名变量是由不超过20个字符的字母/数字/或下划线组成的文本字符串,区分大小写
- 反引号允许将shell命令的输出赋值给变量
- 输入输出重定向(>;<;«;»;)
- 管道:管道一个最受欢迎的用法是用管道传送命令的结果
数学计算:
- expr命令,在脚本中使用expr需要使用shell转义字符(反斜杠)
- 在bash中,为一个变量指定一个数学值时,可以用美元符号("$(())")和方括号($[operation])
- 浮点解决方案:内置的bash计算器bc,要退出bash计算器,必须输入quit命令
- 浮点算术是由scale的内置变量控制,scale变量的默认值是0
- 在脚本中使用bc,可以使用反引号运行bc命令:
variable='echo "options;expression" | bc'
- 内置输入重定向:(EOF文本字符串表明内置重定向数据的开始和末尾)
1 2 3 4 5 6
variable=`bc<< EOF options statements expressions EOF `
- 在bash计算器内创建的变量只在bash计算器内有效。
linux提供$?特殊变量来保存最后一条命令执行结束的退出状态。
Linux退出状态码
代码 描述 代码 描述 0 命令成功完成 128 无效的退出命令 1 通常的未知错误 128+x 时使用Linux信号x的致命错误 2 误用shell命令 130 使用Ctrl-C终止命令 126 命令无法执行 255 规范外的退出状态 127 没有找到命令 默认情况下,shell脚以脚本中最后一条命令的退出状态退出,exit命令允许在脚本结束时,指定一个退出状态(退出状态代码适合0-255范围之内的数)
shell脚本中自定义函数的方法:
1 2 3 4 5 6 7 8
(1) function name { commands } (2) name(){ commands }
if-then语句:
1 2 3 4
if command(如果命令的退出状态是0,将执行后面的所有命令) then ands fi
``
if-then-else语句:
1 2 3 4 5 6
if command then ands else ands fi
嵌套if语句:
1 2 3 4 5 6 7
if command1 then ands elif command2 then commands fi
bash的if-then语句不能评估任何条件,只是一条命令的退出状态码。
test命令:
test condition
test提供一种检测if-then语句中不同条件的方法。test命令能够评估的3类条件:数值比较
字符串比较
文件比较
字符串顺序/比较字符串大小,使用test命令有以下问题:
- 大于和小于符号一定要转义,否则shell会将它们当做重定向符号,将字符串看做文件名。
- 大于和小于顺序与sort命令中的顺序不同。
1 2 3 4 5 6 7 8 9
#!/binbash #mis-using string comparisons a=baseball b=hockey if [ $a > $b ] then "$a is greater than $b." else "$a is less than $b."
在脚本中单独使用大于号,没有生成大于号,没有生成错误,但是结果不对,脚本将大于号理解为输出重定向,所以创建了一个hockey文件。由于重定向成功完成,所以测试命令返回退出状态码0,if语句认为事情成功完成。
复合条件检查:
- [ condition1 ]&&[ condition2 ] (与操作)
- [ condition1 ]||[ condition2 ] (或操作)
if-then高级特征:
- 双圆括号表示数学表达式:(( expression ))
- 双方括号表示高级字符串处理函数:[[ expression ]] (提供了test命令没有的另一个功能,模式匹配,可以定义字符串值相匹配的正则表达式)
- 双圆括号命令符号:
符号 | 描述 | 符号 | 描述 |
---|---|---|---|
val++ | 后增量 | « | 逐位左移 |
val– | 后减量 | >> | 逐位右移 |
++val | 前增量 | & | 逐位布尔逻辑与 |
- -val | 前减量 | || | 逐位布尔逻辑或 |
! | 逻辑否定 | && | 逻辑与 |
~ | 按位取反 | | | 逻辑或 |
** | 取幂 |
case命令(执行多条if-then-else命令并在值列表中检查单个变量值的快速方法):case命令以列表导向格式检查单个变量的多个值:
1 2 3 4 5
case variable in pattern1 | pattern2) commands1;; pattern3) commands2;; *) default commands;; esac
for命令:
1 2 3 4
for var in list do ands done
for命令使用双引号包围值时,shell不会将双引号作为值的一部分。
生成列表中使用的值的另一种方法是使用命令的输出。可以使用反引号字符来执行生成输出的任何命令,然后在for命令中使用命令的输出。
改变字段分隔符(internal field separator,IFS)的特殊环境变量,默认情况下,bash shell将下面字段看做字段分隔符:
- 空格
- 制表符
- 换行符(如果想将IFS的值更改为只识别换行符,只需这样做:IFS=$'\n')
可以使用for命令自动迭代文件的目录。还可以在同一个for语句中将目录搜索方法和列表方法结合起来。
bash中C式for循环的基本格式:
for ((variable assignment;condition;iteration precess #可以使用多个变量))
while命令:
1 2 3 4
while test command do r commands done
while语句行定义允许多条test,只有最后一条测试命令的退出状态是用来决定循环何时停止的。
until命令(until命令刚好与while命令相反。until命令需要致制定一条测试命令,这条命令通常产生一个非0的退出状态,可以使用多条测试命令):
1 2 3 4
until test commands do r commands done
嵌套循环
文件数据的循环
- 使用嵌套循环
- 更改环境变量IFS
循环控制:
- break命令
- 跳出单循环,for,while,until
- 跳出内循环
- 跳出外循环
break n
n表明要跳出的循环级别,默认情况下,n是1,代表跳出当前循环。如果将n设置为2,break命令停止外循环的下一级循环
- continue命令:在while循环和util循环中可以使用continue命令,当shell执行continue命令时,它跳过余下的命令。
- continue也允许使用命令行参数指定要继续的循环级别
continue n
- break命令