Shell 学习
语法特点
脚本顶部声明解释当前脚本所用的工具,
#!/bin/sh或#!/bin/bash语句末尾不加分号
;注释:单行注释
#,多行注释:<<! 被注释的内容 !变量名和等号之间不能有空格
对变量进行操作时不加
$符,使用变量时加$符,如:$name、${name}""不会解释$name,只会解释${name};''会原样解释${name}字符串可以用单引号,也可以用双引号,也可以不用引号
字符串拼接直接不用任何符号,如:
"name:""Toki"条件表达式要放在方括号之间,并且要有空格,例如:
[$a==$b]是错误的,必须写成[ $a == $b ]
变量
用语句给变量赋值
for file in `ls /etc`
# 或
for file in $(ls /etc)只读变量
普通变量名可以被覆盖,只读变量的值不能被改变
删除变量
变量作用域
局部变量:局部变量在 脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
字符串
获取字符串长度
字符串截取
查找子字符串位置
数组
bash 只支持一维数组(不支持多维数组),用 括号 来表示数组,数组元素用 空格 隔开,如:
数组读取
${数组名[下标]}
使用 @ 符号可以获取数组中的所有元素,如:echo ${name[@]}
获取数组的长度
传递参数
$* 与 $@ 区别:
$* 与 $@ 区别:相同点:都是引用所有参数 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)
表达式和运算符
表达式和运算符之间要有空格,例如
2+2是不对的,必须写成2 + 2完整的表达式要用反引号包含
乘号
*前边必须加反斜杠\才能实现乘法运算
关系运算符
布尔运算符
逻辑运算符
字符串运算符
文件测试运算符
输入输出
read 命令,从输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
显示换行
显示不换行
显示结果定向至文件
显示命令执行结果
注意反引号
printf
默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 ,如:
占位符
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内, 如果不足则自动以空格填充,超过也会将内容全部显示出来。%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
逻辑运算
文件操作
test
判断语句
单行
多行
循环语句
for 循环
单行
多行
while 循环
无限循环
until 循环
until 循环执行一系列命令直至条件为 true 时停止。 until 循环与 while 循环在处理方式上刚好相反。 一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
跳出循环
break、continue
case 语句
每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。 取值可以为变量或常数
函数
1、可以带 function fun() 定义,也可以直接 fun() 定义,不带任何参数 2、参数返回,可以显示加 return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255)
注意,$10 不能获取第十个参数,获取第十个参数需要 ${10}。当 n>=10 时,需要使用 ${n} 来获取参数
输入/输出重定向
文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR) 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出
执行 command,从文件 infile 读取内容,然后将输出写入到 outfile 中。
文件包含
被包含的文件 test.sh 不需要可执行权限
Last updated