一、流程
- 新建shell 脚本 :
touch test.sh
- 编辑脚本:
vim test.sh
- 赋予权限:
chmod 777 test.sh
- 运行脚本 :
./test.sh
二、变量
- 变量赋值 :
a="菜鸡滴滴"
- 打印变量:
echo $a
- 只读变量
使用readonly
命令将变量定义为只读
a=”菜鸡滴滴“
readonly a
- 删除变量 :
unset a
三、shell字符串
- 单双引号:字符串可以使用单引号或者双引号,也可以不用引号
- 字符串拼接
a="菜鸡滴滴"
b=123
c="$a$b"
#或者 c=$a$b
echo $c
- 获取字符串长度:
${#string}
a="菜鸡滴滴"
b=123
c=$a$b
# readonly a
echo $c
d=${#c}
echo $d
#或者直接输出 echo ${#c}
- 字符串提取
- 从指定位置开始提取
- 从字符串左边开始计数:
${string:start:length}
,其中start从0开始,length省略表示到字符串结尾 - 从右边开始计数:
${string:0-start:length}
,与左边开始相比,仅仅多了-0,这是固定格式。从右边开始时计数从1开始 - 不管哪种方式,截取方向都是从左到右
- 从字符串左边开始计数:
- 从指定位置开始提取
a="菜鸡滴滴"
b=123
c=$a$b
# readonly a
echo $c
d=${#c}
e=${c:0-2:2}
echo $e
# 输出:23
- 从指定字符串(子字符串)开始截取: 这种截取方式无法指定字符串长度,只能从子字符串截取到字符串末尾。(略)
四、shell 数组
- 定义:array_name=(ele1 ele2 ele3 ele4 … elen) (注意赋值号=两边不能有空格)。
- Shell 为弱类型,不要求所有数组元素的类型相同
- 获取数组元素的值:
${array_name[index]}
- 使用@或者* 可以获取数组中所有的元素:
${nums[*]}或者${nums[@]}
arr=(1 2 3 "菜鸡滴滴")
arr[10]=9
echo ${arr[@]}
- 获取数组元素个数:
${#array[@]} 或者${#array[*]}
arr=(1 2 3 "菜鸡滴滴")
arr[10]=9
echo ${arr[@]}
echo ${#arr[@]}
#结果:
#1 2 3 菜鸡滴滴 9
#5
-
数组拼接:
arr_new=(${arr1[@]} ${arr2[@]})
-
删除数组元素:unset关键字
- 删除单个元素:
unset arr[index]
- 删除整个数组:
unset arr
五、Shell 内置命令
bash 自身提供的命令,而不是文件系统中某个执行文件
- type来确定一个命令是否为内置命令
- alias: 给命令创建别名
- 直接使用 alias 则列出当前Shell进程中使用的别名
- 直接使用 alias 则列出当前Shell进程中使用的别名
- 自定义别名:
alias new_name='command'
,这样定义的只能在当前shell 进程中使用 - 配置自己的alias :
1. 修改 ~/.bashrc 文件:vi ~/.bashrc
2. 在文件中添加自己的alias语句
3. 立即生效:source ~/.bashrc
- echo: 输出字符串
-
不换行: 加上-n 参数
name="Tom" age=20 echo -n "${name} is ${age} years old"
-
解析转义字符:加上 -e 参数
-
在有 -e 参数时,也可使用 转义字符 \c 来命令不换行
- read命令:读取键盘输入的数据
$$ 、$!、$?
获得进程ID信息-
$$
:获得当前进程的ID -
$!
: 获得上一个进程的ID -
$?
: 获得上一个进程结束的状态码 -
例子:
echo "当前进程id : $$" sleep 100 & echo "上一个进程的id: $!" echo "上一个结束的进程状态码:$?"
#结果: #当前进程id : 13797 #上一个进程的id: 13798 #上一个结束的进程状态码:0 # $$获取当前的进程id为13797,之后后台执行sleep,这个后台进程为13798(可用ps命令验证),接着是$? ,输出上一个结束进程的状态码,上一个结束的进程为echo,顺利结束则为0
-
6.exit 退出当前进程
-
exit 为Shell 内置命令,用来退出当前Shell进程 ,并返回一个退出状态,可以用
$?(上一个结束进程状态码)
来接收这个退出状态。 -
exit 命令可以接收一个整数值作为参数,代表退出状态,如果不指定,默认状态值为0。一般情况下,退出状态为0表示成功,为非0表示失败。
-
例子:
#!/bin/bash echo "befor exit" exit 8 echo "after exit" # 结果为:before exit。而after exit并未输出
接着使用
echo $?
获取退出状态码,获得退出状态为:8
-
Shell 数学运算
如果不特别指明,每一个变量的值都是字符串。常用的数学计算如下。
-
if else 语句
# 格式如下 if condition then statement(s) fi # condition为判断条件
注意if后面有个then
或者if condition then statement1 else statement2 fi
或者
if condition1 then statement1 elif condition2 then statement2 elif condition3 then statement3 …… else statementn fi
也可以将then 和if 写在一行上:
这样写if和elif后面都有then
bash if condition; then statement(s) fi
注意condition后的分号,当if 和then位于同一行时,这个分号是必须的
-
test 命令
test是Shell 内置命令,用来检测某个条件是否成立。test通常与if语句一起使用。
test命令有很多选项,可以进行数值、字符串、文件三个方面的检测
Shell test的命令用法:test expression
,也可以简写为[ expression ]
,[]和expression之间的空格是必须的
-
例子
read age if test $age -le 2; then echo "婴儿" elif test $age -ge 3 && test $age -le 8;then echo "幼儿" elif [ $age -ge 9 ] && [ $age -le 17 ];then echo "少年" elif [ $age -ge 18 ] && [ $age -le 25 ];then echo "成年" elif [ $age -ge 26 ] && [ $age -le 40 ];then echo "中年" else echo "老年" fi
其中 -le 选项表示小于等于, -ge表示大于等于
-
与文件检测相关的test 选项
-
与数值变焦相关的test选项
注意test只能用来比较整数,小数相关的比较还是得依赖bc命令
-
与字符串判断相关得test选项
在test中,==、>、<只能用来比较字符串,不能用来比较数字。其次,无论是数字还是字符串,test都不支持>= 和 <= 运算符。
read str1 read str2 # 检测字符串是否为空 if [ -z "$str1" ] || [ -z "$str2"] ;then echo "字符串不能为空" exit 0 fi
-
与逻辑相关得test选项
- expression1 -a expression2 : 逻辑与
- expression1 -o expression2:逻辑或
- !expression : 逻辑非
-
在test中使用变量建议用双引号包围起来,以防止空字符串
-
-
[[]]
: 检测条件是否成立,test的升级版- 在使用
[[]]
时,不需要用“” 将变量引起来,即使为空值也不会出错 - 不需要也不能对
>、<
进行转义,否则会出错 [[]]
剔除了-o和-a
选项,只能使用&&和||
[[]]
支持正则表达式,可以使用=~
判断是否符合某个正则表达式,即[[ str =~ regex ]]
- 不过
[[]]
对数字处理还是不友好,可以使用(())
处理整形数字,用[[]]
处理字符串或者文件
- 在使用
-
while 循环
while condition do statements done
-
for 循环和for int 循环
- c风格
for((exp1;exp2;exp3)) do statements done # exp2为判断条件
2.python 风格
for variable in value_list do statements done
对value_list的说明:
- 给出具体数值:
for i in 1 2 3 4 5
- 给出取值范围:
for i in {1..100}
范围的具体格式为:{start..end}
- 使用命令的执行结果:
for i in $(seq 2 2 100)
,$()
可以取得命令的执行结果,seq用来产生某个范围内的整数,2起始,100结束,步长为2。再如 :for i in $(ls *.sh)
- 使用Shell通配符:
for i in *.sh
- 使用特殊变量:
for i in $@
,还有:$#、$*、$@、$?、$$
- 删除单个元素: