Shell 脚本实践
Shell 用 C 语言编写的程序,既是一种命令行语言,又是一种程序设计语言,用 shell 编写的称为脚本程序(Shell Script)
两种运行方法:
1、作为可执行程序
chmod +x ./test.sh
./test.sh
2、作为解释器参数
sh test.sh
Shell 变量
变量名不加 $ ,且变量名与等号间不能有空格
变量名不能有空格,不能用标点,不能用 bash 关键字
可以用语句给变量赋值
for file in `ls /etc`
遍历 etc 中的文件
使用变量,只需要在变量名前添加 $ ,加花括号可以帮助解释器识别变量名
echo "Hello, ${name}!"
已经定义的变量可以被重新赋值
myUrl="http://www.baidu.com" myUrl="http://www.google.com"
可以声明只读变量
readonly myUrl
删除变量
unset myUrl
Shell 字符串
单引号字符串:任何单引号内的字符串都会原样输出,变量无效
双引号字符串:可以在双引号字符串中输出变量,同时也可以存在转义字符
拼接字符串
echo $a $b # hello loch hello cgg echo $a$b # hello lochhello cgg echo $a + $b # hello loch + hello cgg
获取字符串长度
echo ${#a} # 10 ("hello loch").length
提取字符串
echo ${a:1:4} # 从第二个字符开始提取四个字符
查找字符
echo `expr index "a" is` # error: expr syntax error
Shell 数组
只支持一维数组
array_name=(value0 value1 value2 value3) # or array_name=( value0 value1 value2 ) # or arra_name[0]=value0
读取数组
$(array_name[0])
获取数组长度
echo ${#array_name[@]} # 3 echo ${#array_name[*]}
脚本传参
我们可以在执行脚本时,传递参数,脚本内获取参数的格式为:
$n
# n 为脚本参数的顺序,从1开始
# $0 为当前执行的文件名
特殊参数 | 说明 |
---|---|
$# | 传递的参数个数 |
$* | 将所有参数输出为一个字符串 |
$$ | 输出脚本当前运行的进程 ID |
$! | 后台运行的最后一个进程的 ID,测试失败,返回空 |
$@ | 所有参数的数组引用 |
$- | 显示 Shell 使用的当前选项,与set命令功能相同 |
$? | 显示最后的命令退出状态,0表示没错误 |
#
∗与
@ 的区别
for i in “
∗”;doecho
i
done
# 1 2 3
for i in "$@"; do
echo $i
done
# 循环体执行了3次
Shell 运算符
算数运算符
原生 bash 不支持简单的数学运算,需要借助 expr
expr 是一款表达式计算工具,可以完成表达式的求值
val=`expr 2 + 2`
注意:表达式和运算符之间要有空格,
2+2
不会执行加法运算,而是作为字符串存在;只能进行整数运算运算符 举例 +,-,*,/,% `expr a+ b` = b=$a == if[ a== b] != if[ a!= b] 注意:*前必须添加反斜杠 \ 才能进行乘法运算
关系运算符
注意:关系运算只支持数字,或者值为数字的字符串,空格很必要
运算符 说明 举例 -eq 是否相等 [ a−eq b ] -ne 是否不等 [ a−ne b ] -gt 是否左大于右 [ a−gt b ] -lt 是否左小于右 [ a−lt b ] -ge 是否左大于等于右 [ a−ge b ] -le 是否左小于等于右 [ a−le b ] 布尔运算符
注意:布尔运算符的成员为布尔值或值为布尔类型的表达式
运算符 说明 举例 ! 非 [ !false ]
!与false之间没有空格-o 或 [ a−lt20−o b -gt 100 ] -a 与 类比上面的或 逻辑运算符
&& 与
|| 或与布尔运算符有什么区别。。
字符串运算符
运算符 说明 举例 = 是否相等 [ a= b ] != 是否不等 [ a!= b ] -z 是否长度为 0 [ -z $a ] -n 是否长度不为 0 [ -n $a ] str 是否不为空 [ $a ] 文件测试运算符
操作符 说明 -b file 是否为块设备文件
Linux秉承一切都是文件的设计思想,将所有的块设备也看成文件,通常存放在/dev目录下,磁盘是常见块设备-c file 是否是字符设备文件
键盘和打印机是常见的字符设备-d file 是否是目录 -g file 是否设置了 SGID 位
chmod g+s filename-k file 是否设置了 SBIT 位 -p file 是否是有名管道 -u file 是否设置了 SUID 位 -r file 是否可读 -w file 是否可写 -x file 是否可执行 -s file 是否为空 -e file 是否存在
Shell echo
echo "Hello World"
echo Hello World
echo "\"Hello World"\"
echo "Hello ${name}"
echo "Hello, \n"
# 显示结果定向到文件,覆盖原文件内容或者创建新文件
echo "Hello World" > myfile
# 显示命令执行结果
echo `date`
Shell printf
printf format-string [arguments...]
# format-string 格式控制字符串
# arguments 参数列表
printf 没有自动换行,需要手动添加 \n
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 自超 男 90.1234
# 姓名 性别 体重kg
# 自超 男 90.12
%-10s 表示一个宽度为10个字符的左对齐的字符串,-表示左对齐,没有-表示默认右对齐,如果超过10个字符,也会显示,但是格式会被打乱
%-4.2f 表示浮点数,保留两个小数
%c 表示单个字符
%d 表示整数
转义序列 | 说明 |
---|---|
\a | 警告字符 |
\b | 后退 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 反斜杠 \ |
\ddd | 表示1到3位的八进制字符 |
\0ddd | 表示1到3位的八进制字符 |
流程控制
shell 的流程控制分支不能为空
if 语句
# 写法1 if [condition] then command1 ... fi # 写法2 if [condition]; then command1; fi # 写法3 if [condition] then command1 else command2 fi # 写法4 if [condition1] then command1 elif [condition2] then command2 else command3 fi
for 循环
for var in item1 item2 ... do command1 ... done
通过
$var
变量名来获取当前循环过程的值while 循环
while [condition] do command1 done # while 可以读取键盘信息 while read FILM do echo $FILM done
until 循环
until [condition] do command1 done
虽然 until 在前,但是每次判断在循环末尾,所以循环体至少会执行一次
case 多选语句
case val in mode1) command1 ;; mode2) command2 ;; *) defaultCommand ;; esac
*) 为 default 默认执行项
break 和 continue
break 结束循环
continue 提前结束当前循环,进入下一次循环
Shell 函数
函数定义通用格式
[ function ] funname [()]
{
action;
[return int;]
}
# []中为可选项
demoFun(){
echo 'test func'
}
demoFun
echo $?
# $? == 0
注意:所有函数必须先定义后调用
$?为函数返回值的调用
获取函数参数, 1, 2,,,,当 n>=10 时,${n}来获取参数
特殊参数 | 说明 |
---|---|
$# | 传递到函数的参数个数 |
$* | 以单字符串显示连接显示所有参数 |
$@ | 使用时用引号包裹,返回可遍历的参数列表 |
输入输出重定向
输入重定向
read FILM < hello
echo $FILM
# 获取 hello 文件中的内容,并输出到终端
输出重定向
echo 'test' > hello
# 将本要输出到终端的 'test' 输出到 hello 文件中,覆盖 hello 中原有的内容
定向符 | 说明 |
---|---|
command > file | 重定向输出覆盖 |
command < file | 重定向从文件获取输入 |
command >> file | 重定向输出追加 |
n > file | 将文件描述符为 n 的文件重定向到 file |
n >> file | 追加 |
n >& m | 将输出文件 m n 合并 |
n <& m | 将输入文件 m n 合并 |
文件描述符 0 表示标准输入 STDIN
1 表示标准输出 STDOUT
2 表示标准错误输出 STDERR
文件引用
#!/bin/bash
#
. ./CONFIG.sh
# 引入了 CONFIG.sh 后,可以使用在 CONFIG 中定义的变量和函数
**
前行的路上,感谢您的鼓励!!
**