shell编写手册
前言:
Shell脚本是Linux开发工作中常用的工具,但是我一直没有找到一个适合自己的简明扼要的HandBook。在工作过程中整理了一下,贴在这里以备查看。
一、基础篇
1.对文件的判断:(命令执行成功返回值是0,不成功则是非0)
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
-z 检测字符串长度是否为0,为0返回 true [ -z $a ] 返回 false
-n 检测字符串长度是否不为 0,不为 0 返回 true [ -n "$a" ] 返回 true
2.逻辑判断标识:
-eq //等于
-ne //不等于
-gt //大于 (greater )
-lt //小于 (less)
-ge //大于等于
-le //小于等于
3.特殊变量列表:
变量 |
含义 |
$0 |
当前脚本的文件名 |
$n |
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# |
传递给脚本或函数的参数个数。 |
$* |
传递给脚本或函数的所有参数。 |
$@ |
传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 |
$? |
上个命令的退出状态,或函数的返回值。 |
$$ |
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
4.特殊字符的表达:
\b 退回
\c 打印一行时没有换行符 这个我们经常会用到
\f 换页
\r 回车
\t 制表
\v 垂直制表
\\ 反斜线本身
5.运算符及其优先级:
级别 |
运算符 |
说明 |
13 |
-, + |
单目负、单目正 |
12 |
!, ~ |
逻辑非、按位取反或补码 |
11 |
* , / , % |
乘、除、取模 |
10 |
+, - |
加、减 |
9 |
<< , >> |
按位左移、按位右移 |
8 |
< =, > =, < , > |
小于或等于、大于或等于、小于、大于 |
7 |
= = , ! = |
等于、不等于 |
6 |
& |
按位与 |
5 |
^ |
按位异或 |
4 |
| |
按位或 |
3 |
&& |
逻辑与 |
2 |
| | |
逻辑或 |
1 |
=, + =, - =, * =, /=, % =, & =, ^ =, | =, << =, >> = |
赋值、运算且赋值 |
二、基础循环及其应用范例:
1.单if与if/elif嵌套:
if 条件表达式
then #当条件为真时执行以下语句
命令列表
else #为假时执行以下语句
if 条件表达式
then #当条件为真时执行以下语句
命令列表
elif #当条件为真时执行以下语句
命令列表
elif #当条件为真时执行以下语句
命令列表
else #执行以下语句
命令列表
2.case多分支结构:
case $newval in
1) #这里是可能值1
echo 1
;; #表示第一个分支结束
2) #这里是可能值 2
echo 2
;; #第二个分支结束
*) #表示其他可能值,必须在最后,否则他后面的语句无法执行
echo unkown
esac #case 语句结束
3.for枚举法与累加格式:
枚举:
for n in {1..10}
do
echo $n
done
累加:
for (( i=1;$i<10;i++))
do
echo $i
done
for(( i=1;$i<10;i=$[$i+1’ ])
do
echo $i
done
4.while循环读取 文本:
while read filename
do
echo $filename
done < names.txt
三、一些注意事项:
1.break 命令不执行当前循环体内break下面的语句从当前循环退出.
continue 命令是程序在本循体内忽略下面的语句,从循环头开始执行.
2.将脚本或者命令放到后台执行:
1)在命令后加上 & 字符来实现,需要注意的是输出进程号:sh 1.sh &
2)在命令前使用:nohup command > log.file 2>&1 &
3)将后台运行的程序切回到前台:#fg %2
3.匹配IP地址:
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\ 匹配是否为IP地址
4.shell自增的五种办法:
i=`expr $i + 1`;
let i+=1;
((i++));
i=$[$i+1];
i=$(( $i + 1 ))
另外,对于固定次数的循环,可以通过seq命令来实现,就不需要变量的自增了;实例如下:
#!/bin/bash
for j in $(seq 1 5)
do
echo $j
done
值得注意的是seq默认从1开始计数,如:seq 5,则表示1-5的数字,其次,seq -w 表示输出同位数的数字序列,如:seq -w 999 ,则表示从001打印数字到999
5.使用命令来修改密码:
echo 密码 | passwd --stdin 用户名;
附:打印时的字体颜色设置:
echo 输出的字颜色
echo -e ‘\e [1;31m this is red color.\e[0m’
ansi 控制码表及颜色代码
背景颜色范围: 40--49 |
字休颜色: 30--39 |
ANSI控制码: |
40: 黑 |
30: 黑 |
\033[0m 关闭所有属性 |
41: 红 |
31: 红 |
\033[1m 设置高亮度 |
42: 绿 |
32: 绿 |
\033[4m 下划线 |
43: 黄 |
33: 黄 |
\033[5m 闪烁 |
44: 蓝 |
34: 蓝 |
\033[7m 反显 |
45: 紫 |
35: 紫 |
\033[8m 消隐 |
46: 深绿 |
36: 深绿 |
\033[30m -- \033[37m 设置前景色 |
\033[40m -- \033[47m 设置背景色 | ||
\033[nA 光标上移n行 | ||
\033[nB 光标下移n行 | ||
\033[nC 光标右移n行 | ||
\033[nD 光标左移n行 | ||
\033[y;xH 设置光标位置 | ||
\033[2J 清屏 | ||
\033[K 清除从光标到行尾的内容 | ||
\033[s 保存光标位置 | ||
\033[u 恢复光标位置 | ||
\033[?25l 隐藏光标 | ||
\033[?25h 显示光标 |
如果想让字体变为红色并且不停的闪烁
#echo -e "\033[31m \033[05m 请确认您的操作,输入 [Y/N] \033[0m"
或者
#echo -e "\033[31m \033[05m 请确认您的操作,,输入 [Y/N] \033[0m"
接下来 只需要将定义颜色的变量复制进自己的脚本,便可以方便的在脚本中应用了
附:补充