Shell基础入门
Posted Linux系统运维之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell基础入门相关的知识,希望对你有一定的参考价值。
目录
Shell基础入门
1、什么是Shell?
? Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序,用户每输入一条命令,Shell就解释执行一条。Shell存在于操作系统的最外层,负责和用户直接对话,把用户的输入解释给操作系统,并处理各种各样的操作系统输出结果 ,然后输出到屏幕返回给用户。
? 而Shell脚本就是命令或程序语句不在命令行下执行,而是通过一个程序文件来执行。
2、Shell脚本的结构
? 在Linux系统中,Shell脚本通常是使用Vim编辑器进行编写,其内容大多数是命令和程序结构控制语句以及注释构成。其规范的格式如下:
- Shell脚本的第一行为指定脚本解释器,通常为:
#/bin/bash 或 #/bin/sh
- Shell脚本添加版本和个人信息
# Date: 2019-03-08 15:30
# Author: KIM
# Description: nginx_log_cut
# Version: 1.1
- Shell脚本中尽量不使用中文
- Shell脚本的命名应该以.sh为扩展名
- Shell脚本应该放在固定的路径下,如/server/scripts
- 使用合适的代码缩进规范
3、Shell的变量
变量的类型:环境变量(全局变量)和普通变量(局部变量)
环境变量:也可称为全局变量,可在在创建他们的shell及其派生出来的任意子进程shell中使用,环境变量又可氛围自定义环境变量和bash的内置环境变量
普通变量:也可称为局部变量,只能在创建他们的shell函数或者shell脚本中使用,普通变量一般由开发者在开发脚本程序时创建。
3.1.自定义环境变量
如果像要设置环境变量,就要在给变量赋值之后或在设置变量时用export命令。除了export命令,带-x选项的declare内置命令也可以完成同样的功能(注意:此处不要再变量名前加$)
exprot命令和declare命令的格式如下:
- ①export 变量名=value
- ②变量名=value; export 变量名
- ③declare -x 变量名=value
[[email protected] ~]# export NAME=long
[[email protected] ~]# echo $NAME
long
[[email protected] ~]# declare -x NAME=li
[[email protected] ~]# echo $NAME
li
[[email protected] ~]# NAME=ing;export NAME
[[email protected] ~]# echo $NAME
ing
3.2.普通变量
定义方式有3种:
? 变量名=value #赋值时不加引号
? 变量名=‘value‘ #赋值时加单引号
? 变量名="value" #赋值时加双引号
定义脚本退出状态码
? exit: 退出脚本
? exit #
如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码;
测试脚本是否有语法错误:
? bash -n 脚本
? bash -x 脚本:单步执行
3.3.位置参数变量
? 在Shell中存在一些特殊的位置参数变量,当我们在命令行、函数或脚本执行时传递参数时,此时就需要使用位置参数变量。如下表:
位置变量 | 作用 |
---|---|
$0 | 获取当前执行的Shell脚本文件名,如果执行脚本包含路径,那么就包含脚本路径 |
$n | 获取当前执行Shell脚本的第N个参数,n=1..9,当n=0时,表示脚本文件名;n>9用大括号括起来{10},接的参数要 以空格隔开 |
$# | 获取当前执行的Shell脚本后面接的参数的总个数 |
$* | 获取当前Shell脚本所有传参的参数,不加引号和[email protected]相同;加了引号,如"$*"表示所有参数视为单个字符串,相当于"$1 $2 $3" |
[email protected] | 获取当前Shell脚本所有传参的参数,不加引号和$*相同 |
3.4、状态变量
位置变量 | 作用 |
---|---|
$? | 获取上一个执行指令的状态返回值,0为成功,非0为失败 |
$$ | 获取当前执行的Shell脚本的进程号 |
$! | 获取上一个在后台运行的进程的进程号 |
$_ | 获取在之前执行命令或脚本的最后一个参数 |
4、条件测试和比较
4.1、条件测试常用的语法形式:
test <测试表达式>
[ 测试表达式 ]:[]两端需要有空格
[[ 测试表达式 ]]:两端需要有空格,与[]和test的区别在于,在[[]]中可以使用通配符等进行模式匹配;并且与&&、||、>、<等操作符可用于[[]]中,但不能用于[]中,在[]中一般使用 -a、-o、-gt(用于整数)、-lt。除了使用通配符的功能之外,建议放弃该用法。
((测试表达式)):一般用于if语句里,两端不需要空格
示例:
[[email protected] ~]# test -f file && echo ture || echo false
false
表示如果file文件存在,则输出true,否则输出false。
[[email protected] ~]# [ -f /etc/passwd ] && echo 0 || echo 1
0
表示如果/etc/passwd文件存在,则输出0,否则输出1
[[email protected] ~]# [[ -f /etc/passwd && -d /123/ ]] && echo 0 || echo 1
1
表示如果/etc/passwd文件存在,并且/123/目录也存在,则输出0,否则输出1
4.2、文件测试表达式的用法:
常用的文件测试操作符:
-d:文件存在且为目录则为真,即测试表达式成立
-f:文件存在且为普通文件则为真,即测试表达式成立
-e:文件存在则为真,即测试表达式成立
-r:文件存在且可读则为真,即测试表达式成立
-w:文件存在且可写则为真,即测试表达式成立
-x:文件存在且可执行为真,即测试表达式成立
-s:文件存在且文件大小不为0,即测试表达式成立
tips:测试文件的读、写、执行属性,不光是看文件属性rwx的表示进行判断,还需要看当前执行测试的用户是否真的可以按照对应的权限操作该文件。
特殊条件测试表达式案例:
以下写法适用于所有的条件测试表达式,是工作中比较常用替代if语句的方法。判断条件测试表达式的条件成立与否,还需要继续执行多条命令语句的语法形式如下:
[ 条件1 ] && {
COMMAND 1
COMMAND 2
COMMAND 3
}
[[ 条件1 ]] && {
COMMAND 1
COMMAND 2
COMMAND 3
}
test 条件1 && {
COMMAND 1
COMMAND 2
COMMAND 3
}
相当于if语句:
if [ 条件1 ]
then
COMMAND 1
COMMAND 2
COMMAND 3
fi
4.3、字符串测试表达式
字符串测试操作符:
-n "字符串":若字符串的长度不为0,则为真,即测试表达式成立。
-z "字符串":若字符串的长度为0,则为真,即测试表达式成立。
"串1" = "串2":若串1等于串2,则为真,即测试表达式成立,可用==代替=
"串1" != "串2":若串1不等于串2,则为真,即测试表达式成立,可用!==代替!=
tips:字符串比较时等号两边需要空格,没有空格会导致逻辑错误。
4.4、整数二元比较操作符
在[]和test中使用 在(())和[[]]中使用
-eq == 或 =
-ne !=
-gt >
-ge >=
-lt <
-le <=
4.5、逻辑操作符
在[]和test中使用 在(())和[[]]中使用
-a &&
-o ||
! !
5、If条件语句
条件语句语法:
单分支if语句
if 判断条件; then
statement1
statement2
...
fi
双分支的if语句:
if 判断条件; then
statement1
statement2
...
else
statement3
statement4
...
fi
多分支的if语句:
if 判断条件1; then
statement1
...
elif 判断条件2; then
statement2
...
elif 判断条件3; then
statement3
...
else
statement4
...
fi
6、case语句
? case条件语句相当于多分支的if/elif/else条件语句,但是它比这些条件语句看起来更规范更公正,常被应用于事先系统服务启动脚本等企业应用场景中。
? 在case语句中,程序会将case获取的变量的值与表达式部分的值1、值2、值3等逐个进行比较,如果获取的变量值和某个值(例如值1)相匹配,就会执行值后面对应的指令,直到执行到双分号;;才会停止,然后再跳出语句主体,执行case语句后面的其他指令。
? 如果没有找到匹配变量的任何值,则执行"*)"后面的指令(通常是给使用提示),直到遇到双分号;;或esac结束,这部分相当于if多分支语句中最后的else语句部分。
case语句语法:选择结构
SWITCH为变量的值,对变量的值进行引用,并进行判断选择
case SWITCH in
value1)
statement
...
;;
value2)
statement
...
;;
*)
statement
...
;;
esac
范例1:根据用户的输入判断用户输入的是哪个数字,如果是1-9的任意数字,则输出对应的数字;如果是其他数字及字符,则返回输入不正确的提示并退出程序。
[[email protected] ]# vim num.sh
#!/bin/bash
while :;do
read -p "please input your number:" A
case $A in
1)
echo "You input the number is 1."
;;
[2-9]*)
echo "You input then number is $A ."
;;
q|Q)
echo "quiting ..."
exit 0
;;
*)
echo "Your input is error.please input your number again."
;;
esac
done
范例2:给出水果列表,并输出客户选择的水果,且用不同的颜色显示不同的水果。
#!/bin/bash
cat << EOF
1. apple
2. pear
3. banana
4.cheery
EOF
while :;do
read -p "Do you have some fruits." FRUITS
case $FRUITS in
1)
echo -e "