-
1,蛇帮,两种写法都可以。
#! /bin/sh
#! /bin/bash
-
2,执行,两种方法。
- ①
/bin/sh test.sh
(用解释器执行文件,写了蛇帮也没用) - ②
chmod +x test.sh
:先设定可执行权限
./test.sh
:(可执行程序执行)再执行
- ①
-
3,定义变量
变量名和等号之间不能有空格
变量名只能使用英文字母,数字,下划线,不能以数字开头
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash中的关键字
-
4,使用变量,两种方式(echo 相当于 print)
name='zhangsan' echo $name echo ${name} --> 为了区分边界,推荐使用这种
-
5,只读变量
name='aaa' readonly name --> 设置只读属性 name='bbb' --> 再次赋值就会报错:This variable is read only.
-
6,还可删除变量
unset 变量名 --> 不能删除只读变量 name='aaa' unset name echo ${name} --> 被删除后,不在输出
-
7,获取字符串长度
echo ${#name} --> 输出字符串长度
-
8,字符串切片
str='my name is aaa' str2=${str:1:4} echo ${str2} --> m na,提取索引1和索引4位置中间字符
-
9,查找字符索引位置(第一个出现的字符)(内含反引号)
echo `expr index "$str" ib` --> 查找i或者b的索引位置,写一个就查一个
-
10,数组
定义数组: arr=(1 3 5 7 9) --> 一次性赋值,没有逗号,一定不要加逗号,加上逗号会成为1个元素 arr1[0]=1 --> 一个个赋值,不用提前设定变量 arr1[1]=2 arr1[2]=3 获取数组数据: ${arr[index]} --> 获取单个元素 ${arr[@]} --> 获取所有元素
-
11,获取数组长度
echo ${#arr[@]} echo ${#arr[*]} 获取单个元素长度 echo ${#arr[5]}
-
12,注释
单行注释:# 多行注释: :<<! 注释内容... 注释内容... 注释内容... ! (!可换成其他符号)
-
13,传参
$0 命令的第一个参数 --> 文件名 $1 命令的第二个参数 --> 除文件名以外的第一个参数 ......以此类推 $# 除文件名以外的参数个数 $* 将参数组合成一个参数,以字符串形式显示 $@ 将所有参数,单独分开显示
-
14,if逻辑语句,如果else中不做任何动作,就不能有else
if [ 条件 ]; then 执行 elif [ 条件2 ]; then 执行 else 执行 fi
-
15,循环语句
for循环: for i in x; do 执行 done while循环: int=1 while (( $int<=5 )) do echo $int let "int++" done until循环: until [ ! $a -lt 10 ] do echo $a a=`expr $a +1` done case情况: read num case $num in 1) echo 你输入了1 ;; 2) echo 你输入了2 ;; *) echo 你输入的不是1或2 ;; esac 跳出循环(break): while : do echo -n 输入1到3之间的的数字: read num case $num in 1|2|3|) echo 你输入了 $num ;; *) echo 你输入超出了范围,输入结束 break ;; esac done 跳出本次循环,执行下次(continue): while : do echo -n 输入数字: read num case $num in 4) continue ;; *) echo 你输入了 $num ;; esac done
-
16,基本运算符
原生bash不支持简单的数学运算,但可以通过其他命令实现,比如 awk、expr,expr最常用
表达式中的运算符两边必须有空格,比如:2 + 2
完整的表达式要被``反引号,包含 ⬇算数运算符: + - * / % = == != 加 减 乘 除 取余 赋值 相等 不等 `expr 2 + 2` --> 4 `expr 2 \* 2` --> 4 乘法需要加上反斜杠 echo $[2+2] --> 4 关系运算符: -eq --> 判断是否相等 -ne --> 判断是否不等 -gt --> 判断是否大于 -lt --> 判断是否小于 -ge --> 判断是否大于等于 -le --> 判断是否小于等于 布尔运算符:(非与或) ! 非运算,取反的意思 -o 或运算,等同于 && -a 与运算,等同于 || 字符串运算符: = --> 是否相等,返回布尔值 != --> 是否不等,返回布尔值 -z --> 字符串长度是否为0,为0返回true -n --> 字符串长度是否为0,不为0返回true $ --> 字符串是否为空,不为空返回true 例:if [ -z'' ];then echo "字符串为空"; fi 文件测试运算符(注意格式,中间有空格): -b file 检测文件是否是块设备文件,是返回true -c file 检测文件是否是字符设备文件,是返回true -d file 检测文件是否是目录,是返回true -f file 检测文件是否是普通文件,是返回true -r file 检测文件是否可读,是返回true -w file 检测文件是否可写,是返回true -x file 检测文件是否可执行,是返回true -s file 检测文件是否为空难(文件大小是否为0),不为空返回true -e file 检测文件/目录是否存在,存在返回true 例:if [ -d $file ]; then echo "是目录"; else echo "不是目录"; fi
-
17,read,显示变量,相当于input
#! /bin/sh read name echo "我叫 $name" ./test.sh 执行,会等待输入,输入aaa,显示结果,我叫aaa
-
18,显示不换行,-c不换行
echo -e 'nihao \c';echo 'haha'
-
19,显示结果定向至文件,>定向符
echo "你好" > test
-
20,原字符串输出,不转译,用单引号''
name=aaa echo $name --> aaa echo "$name" --> aaa echo '$name' --> $name
-
21,显示命令执行结果,反引号
echo `date`
-
22,test 检查某个条件是否成立,可对数值、字符、文件三方面进行检查
数值: if test $[num1] -eq $[num2]; then echo '两个数相等!'; else echo '两个数不相等!'; fi 字符: if test $num1 = $num2; then echo '两个字符串相等!'; else echo '两个字符串不相等!'; fi 文件: if test -e ./bash; then echo '文件已存在!'; else echo '文件不存在!'; fi 感觉 if case test 语句都差不多。都可以代替使用。
-
23,函数
【定义函数】 demoFun(){ echo "这是我的第一个 shell 函数!" } echo "-----函数开始执行-----" demoFun --> 【执行函数,不加括号】 echo "-----函数执行完毕-----"
-
24,函数返回值,以及获取返回值
funWithReturn(){ echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum return $(($aNum+$anotherNum)) } funWithReturn echo "输入的两个数字之和为 $? !" 【$? 获取函数执行的返回值】
-
25,函数参数
funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 ${10} !" --> 当n>=10时,需要使用${n}来获取参数 echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73
-
26,输出重定向
ifconfig > test.log --> 将内容输出到文件(文件不存在会创建,存在会覆盖) ls >>test.log --> 将内容追加至文件,不是覆盖(只写入正确命令) aaa 2>>test.log --> 将错误的信息记录下来(只记录错误命令,正确的会执行,不写入) 错误输出时,符号左右两边没有空格,正确输出时无所谓) 命令 > 文件 2&1 --> 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中 命令 &>文件 --> 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中 命令 >> 文件 2>&1 --> 以追加的方式,把正确输出和错误输出都保存到同一个文件中 命令 &>>文件 --> 以追加的方式,把正确输出和错误输出都保存到同一个文件中 命令>>文件1 2>>文件2 --> 把正确输出追加到文件1,错误输出追加到文件2 command > /dev/null:将命令结果放进黑洞,不显示,也不写入文件
-
27,文件包含(文件导入)
test1.sh #!/bin/bash echo 我是test1 test2.sh #!/bin/bash source ./test1.sh --> 导入,或者使用【. ./test1.sh】,点后有一个空格。 ./test2.sh 执行,得出结果:我是test1
-
28,其他
echo 引号可加可不加 \ 反斜杠代表转译 shell 语言中 0 代表 true,0 以外的值代表 false。
网友评论