1.什么是shell
shell从根本上是一个命令解析器,接收用户的简单命令,送到内核去调用Linux封装好的程序执行。
shell脚本是一个以#!(shebang)开头的文件:#!/bin/bash,/bin/bash是bash解释器命令路径。shell脚本运行方式有两种:
(1)- bash scripts.sh # 将脚本作为命令行参数(可舍去shebang)
(2)- chmod a+x scripts.sh; - ./scripts.sh# 赋予可执行权限(内核读取shebang,并执行:/bin/bash scripts.sh)
2.基本语法
(1) 输出
echo "hello world"; echo 'hello world'; echo hello world
引号的作用:双引号需转义叹号;单引号不能使用变量替换;无引号不能显示分号
printf "%-5s %-10s %-4s\n" No Name Mark
%-5:左对齐宽度为5;%5:右对齐宽度为5;
%s—字符串;%c—字符;%d—十进制;%f—浮点数
(2) 变量
定义:a=1;
使用:$a;
获得字符串长度:length=${#var}# 含义为:echo $var | bc
识别当前shell:$SHELL、$0
(3) 算数/逻辑运算
整数:
let a=b+c;
a=$[ b + c ]
a=$(( b + c ))
a=$(expr $b + $c )
a=`expr $b + $c`
浮点数:# 反引号``执行了语句并获得返回值;bc命令是用于数学计算的高级命令
a=`echo "$b * $c" | bc`
a=`echo "scale=2;$b/$c"`
a=`echo "obase=2;ibase=10;$no"`# 进行了进制转换
逻辑运算:
-gt:大于;-lt:小于;-ge:大于或等于;-le:小于或等于;-ne:不等于
(4) 文件重定向
shell可将输出的内容重定向到文件,存储起来
0——stdin——标准输入;1——stdout——标准输出;2——stderr——标准错误
echo "hello world" > stdout.txt # 重定向文本,等同于1>
echo "hello world"2> stderr.txt # 重定向错误
echo "hello world"2>&1 std.txt # 重定向本文和错误
echo "hello world"&> std.txt # 重定向本文和错误
echo "hello world">> atdout.txt # 追加文本
(5) 数组
shell里面的数组支持字符串作为索引,即关联数组
定义数组:arr=(1 2 3 4 5)
单个赋值:arr[0]="test1";arr[1]="test2"
打印数组元素:echo ${arr[0]} | echo ${arr[$index]} | echo ${arr[*]} # 打印所有元素
打印数组长度:echo ${#arr[*]}
定义关联数组:
declare -A arr
arr=([index1]=val1 [index2]=val2)
arr[index1]=val1
(6) 过滤器与管道
命令称作过滤器,管道连接多个命令:cmd1 | cmd2 | cmd3
定义子shell:cmd1;(cmd2);cmd3 # 括号中的命令执行时,不会对当前有任何影响
(7) 调试相关
别名定义:alias install='sudo apt-get install'
获取日期:date; date +%s; date "+%d %B %Y"
设置日期:date -s XXX; 执行时间:start=date +%s; end=date +%s | time<scriptpath>
set -x # 打印出执行的每一行及当前状态
set +x # 禁止调试
set -v # 当命令进行读取时显示输入
set +v # 禁止打印输入
读取n个字符存入变量:read -n 2 var
特定时间内读取:read -t 2 var
特定定界符作为输入结束:read -d “;” var
显示提示信息:read -p "Enter"
无回显显示密码:read -s var
运行命令直至成功:repeat(){}
(8) 空格
- 等号赋值两边不能有空格
- 命令与选项之间需要空格
- 管道两边空格可有可无