-
Linux shell 是一种特殊的交互式工具,它提供了文件管理,运行进程的途径。
-
Shell 的核心是命令提示符,允许用户输入命令,然后解释命令,并在内核中执行。
-
用户可以编写脚本文件,将多个 shell 命令以某种形式组织起来,作为程序一起执行
程序执行方式
编译:高级语言–>编译器–>目标代码(Java,C#)
解释:高级语言–>解释器–>机器代码(shell,python)
- shell编程:过程式,解释执行
- shell脚本:包含一些命令或声明,并符合一定格式的文本文件
- 格式要求:首行 shebeng 机制
如:
#!/bin/bash #!/usr/bin/python #!/usr/bin/perl
shell脚本的用途:
- 自动化常用命令
- 执行系统管理和故障排除
- 创建简单的应用程序和处理文本或文件
变量的命名法则:
不能使用程序中的保留字:如if,for
只能使用数字,字母下划线。且不能使用数字开头
命名尽量有意义,可用驼峰命名法
局部变量1. 变量赋值:name='value'或"value"
- 变量可以是字符串:name=“string”
3. 变量引用:name=“$USER”
4. 命令引用:- name=hostname
- name=$(hostname)
5. 变量的引用:${name} ,$name
6. 显示已定义的所以变量:set
7. 删除变量:unset name(变量名)
环境变量
-
变量声明,赋值:
- export name=值
- declare -x name=值
- 变量引用: n a m e , {name} , name,name
- 显示环境所有变量:env,export,declare -x,printenv
- 删除变量:unset name
- export name=值
var=`cat /etc/文件名`
echo "${var}"
#" " 当中加变量输出可以保留文件格式
echo $$
#输出当前进程号
echo $PPID
#输出父进程号
#pstree -p 查看进程树
#export/declare -x 都可以声明环境变量
#env/export 都可以显示环境变量
#unset 变量名 删除变量
只读和位置变量
()中执行命令开启子shell不影响当前环境。{}中执行命令补开启子shell影响当前环境。()和{}的共同点作为一个整体把括号内的多个内容作为一个整体同一执行
1. 只读变量(常量):只能声明,不能修改和删除。 2. 声明只读变量: * readonly name * declare -r name 3. 查看只读变量:readonly -p 4. 位置变量:在脚本代码中调用通过命令行传递给脚本的参数 * $1,$2...:对应第1个,第2个...参数
-
${10} :10个以上的参数要加上{ } ,不然会识别成" $1+0"
-
$*:传递给脚本的所有参数,作为一个整体进行传参
- @ : 传 递 给 脚 本 的 所 有 参 数 , 每 个 参 数 独 立 分 开 ( = = " @:传递给脚本的所有参数,每个参数独立分开(==" @:传递给脚本的所有参数,每个参数独立分开(=="*“和”$@"只有在被双引号包起来才会有差异==)
-
$0 :命令本身 (是软连接是代表软连接)
- set – 清空所有差数
- shift 去掉第一参数后续参数向前移动一位(也可以指定去掉几个 shift n 默认去掉一个)
* 0代表执行成功,1-255代表失败
true: 返回状态码为0,false返回值为 1
* $? 保存最近退出的命令和脚本退出的状态
* exit [n] 可以自定义n为什么数字,退出后赋值给{ $?}
* 注意:脚本中一旦执行到exit ,脚本会自动退出。脚本退出的状态取决于脚本执行最后一条命令的状态码:
* sleep [n] 执行这条命令程序休眠n秒
逻辑运算符
-
非:!
-
!1 = 0; !0=1;
-
短路与 &&
-
命令1 && 命令2 ; 如果命令1为真时执行执行命令2,反之命令1为假时不需要执行命令2.
-
短路或 ||
-
命令1 || 命令2 ; 如果命令1为假时执行执行命令2,反之命令1为真时不需要执行命令2.
-
异或:^
-
异或的两个值,相同为假不同为真
-
a=4 b=6; a=$[a^b];b=$[a^b];a=$[a^b];echo $a $b
#!/bin/bash
x=a
y=b
[ "$x" = "$y" ] && echo 1 || echo 2
#[ ] 内可以做数值运算也可以做字符串比较
#x与y值相等打印1,x与y值不相等打印2
#怎么判断磁盘利用率大于80
#
DF="`df | grep sd | tr -s " " ":" | cut -d: -f5 | cut -d% -f1| sort -nr| head -nl`"
[${df} -ge 80 ] && echo ">80%"
```
### 基础算术
1. bash中算术运算+,-*,/,%(取余数),**(乘方),[help let]
2. let var=算术表达式
3. var=$[算术表达式]
4. var=$((算术表达式))
5. declare -i var = 数值
6. echo `算术表达式` | bc
7. 乘法符号有些场合中需要转义,如*
8. bash中有内置随机数:$RANDOM (0-32767)
* echo $[$RANDOM%50] 取0-49之间的随机数
##### 赋值
1.增强型:+=,-=,*=,/=,%=
* 如 let n+=3 #n=n+3
2. 自增,自减
* let n++ #n+1
* let n-- #n-1
###### read 交互赋值
* 基本语法
* -p:指定读取值时的提示符;
* -t:指定读取值时等待的时间(秒)如果-t不加表示一直等待
```shell
[root@ytzZ shell01]# read a b c
1 2 3
[root@ytzZ shell01]# echo $a $b $c
1 2 3
#!/bin/bash
read -t 10 -p "请输入用户名称:" name #没有输入时,在10秒后自动退出
echo "welcome, $name"
expr 整数运算
#运算符之间要有空格 # + ,- ,* ,/ [root@ytzZ ~]expr 2 + 3 5 [root@ytzZ ~]echo $[2 + 3] 5条件判断
[root@hadoop100 ]# a=18 [root@hadoop100 ]# test $a = 18 #判断a 是否等于Hello [root@hadoop100 ]# echo $? #捕获返回值——>true: 返回状态码为0,false返回值为 1 0 [root@hadoop100 ]#[ $a = 18 ] #判断a 是否等于Hello [root@hadoop100 ]# echo $? #捕获返回值——>true: 返回状态码为0,false返回值为 1 0 [root@hadoop100 ]#[ dawdadwadaw ] [root@hadoop100 ]# echo $? 0 [root@hadoop100 ]#[ ] [root@hadoop100 ]# echo $? 1流程控制
- 单分支
if [ 条件判断式 ]; then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi
- 多分支
if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 else 程序 fi #/bin/bash if [ $1 -lt 18 ] then echo "未成年 $1" elif [ $1 -lt 25 ] then echo "壮年 $1" elif [ $1 -lt 50 ] then echo "中年 $1" else echo "老年 $1" fi
- case 语句
#基本语法 case $变量名 in "值1") 如果变量的值等于值1,则执行程序1~ ;; "值2") 如果变量的值等于值2,则执行程序2~ ;; …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac #(1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。 #(2)双分号“;;”表示命令序列结束,相当于java中的break.. #(3)最后的“*)”表示默认模式,相当于java中的default。~ #/bin/bash case $1 in "1") echo "*" ;; "2") echo "**" ;; "3") echo "***" ;; "*") echo "-----" ;; esac3. 循环(for-while)
-
基本语法
for((初始值; 循环控制条件; 变量变化)) do 程序 done #!/bin/bash #"$(( 运算式 ))"和"$[ 运算式 ]" for (( i=0; i <= $1; i++ )) do sum=$[ $sum + $i ] done echo $sum #/bin/bash if (( $1 > 1 )) then echo "OK" else echo "NO" fi
-
基本语法2
for 变量 in 值1 值2 值3...
do
程序
done
#!/bin/bash
for i in 1 2 3 4;do echo $i; done
for i in {1..50}
do
sum=$[ $sum + $i ]
done
echo $sum
∗
−
−
−
−
−
−
−
*-------
∗−−−−−−−@
# $@ 和 $* 的区别 #!/bin/bash echo "==========$*========" for i in $*; do echo $i; done echo "==========$@========" for i in $@; do echo $i; done echo "=========="$*"========" for i in "$*"; do echo $i; done echo "=========="$@"========" for i in "$@"; do echo $i; done
- whlie
#语法 while [ 条件判断式 ] do 程序 done #从1加到100 #!/bin/bash i=1 while [ $i -le 100 ] do sum2=$[ $sum2 + $i ] i=$[ $i + 1 ] done echo $sum2 i=1 echo "======let======" while [ $i -le 100 ] do let sum3+=$i let i++ done echo $sum3



