一、变量
命名规则:只能使用英文字符、数字和下划线,首个字符不能以数字开头
不能使用bash里的关键字(可以用help命令查看保留关键字)
定义变量:a_name="name"
打印变量:echo $a_name
只读变量:
a="123"
readonly a
a就变为了只读变量,不能更改,也不能被删除,变量的作用域是在当前窗口,把当前窗口关闭后,变量就自动释放了
删除变量:unset a
变量基本类型
字符串:a_name="your_name"
拼接字符串:greeting="hello,"$a_name"!" --我尝试在本地不能直接运行,见下图
这个拼接字符串在不同的环境效果不一样,如下图
数组:my_array=(v1 v2 v3 v4)
获取数组的值:value1=${my_array[0]}
单独赋值:my_array[0]=1
见下图操作,第一次写错了很多,bash脚本看起来语法挺多的
在数组中照下图写入*和@符号,可以打印数组的所有值:
二、控制语句
if 条件分支:
语法:
if condition;
then
command 1;
command 2;
...
command n;
fi;
eg: if [ $a -eq $b ]; then echo "equal"; elif [ $a -lt $b ]; then echo "small"; elif [ $a -gt $b ]; then echo "big"; fi
最开始的时候这么写,不能达到预期的输出结果,其原因是1==2这个条件,等号两边要加空格,这语法很容易出错
改成如下的则能正常运行了
另外,如果是判断大于或者小于,条件语句应该写为 if [[ 1 < 2 ]],增加一对中括号,如果将<符号换为-lt则不用增加中括号
-eq 等于,-lt 小于,-gt 大于
for 循环语句:
语法:
for var in item1 item2 ... itemn;
do
command 1;
command 2;
...
command n;
done;
简单演示:
循环读取文件内容并输出:
从截图可以看出cat命令输出是以空格进行分行的,loop文件内容实际为a b c d,但循环读取出来编程了竖着显示
while循环语句:
语法:
while condition;
do
command 1;
command 2;
...
command n;
done;
循环读取文件并输出:
可以看到读取loop文件,a和b之间并没有换行
三、read命令
read命令是从终端或者文件中读取输入的内部命令,读取整行输入,每行末尾的换行符不被读入
1、从标准输入读取输入并赋值为变量
read var
2、从标准输入读取多个内容给多个变量
read var1 var2
3、不指定变量,默认赋值给REPLY
四、脚本参数传递
我们可以将bash命令写入到一个sh文件中,称为脚本文件,可以给sh文件进行参数传递:在执行sh文件命令后增加空格,再加上特殊的参数,那么就可以传参给sh文件
$0 脚本名称
$1-$n 获取参数
$# 传递到脚本的参数个数
$$ 脚本运行的当前进程ID号
$* 以一个单字符串显示所有向脚本传递的参数
$? 显示最后命令的退出状态,0表示没有错误,其他任何值表名有错误
运行结果:
五、算术运算
a=10 b=20
+ `expr $a + $b`
- `expr $a - $b`
* `expr $a \* $b`
/ `expr $b / $a`
% `expr $a % $b`
= 赋值,a=$b,将变量b的值赋给a
== 相等,作为判断条件,等号两边要有空格
!= 不等于,作为判断条件
-eq 判断是否相等
-ne 判断是否不相等
-gt 判断是否大于
-lt 判断是否小于
-ge 判断是否大于等于
-le 判断是否小于等于
六、bash脚本与Linux命令结合
1、创建目录并生成文件
mkdir test
cd test
echo "hello">test.txt
ls
2、统计内存使用
for i in `ps aux | awk '{print $6}' | grep -v 'RSS'`;
do count=$[$count+$i];
done;
echo "$count/kb";