shell编程基础实践教程
shell基础理论
图形界面或命令(dos/shell/hdfs-dfs)/程序->系统api->系统->硬件
#shell
#what
#是一个环境,提供了对linux(unix)系统的接口
#向你接收输入,并根据输入执行程序,并显示程序的输出
#可以运行我们的命令,程序和shell脚本
classification
#就行有不同类型得系统一样,shell也有不同版本,每个版本都有自己得一套命令1和功能
unix shell写于20世纪70年代中由斯蒂芬伯恩,在新泽西AT&T贝尔实验室
Bourne shell. 提示符$后面跟命令行参数
C shell. 提示符%
shell脚本
#命令列表中列出的顺序执行
#创建->编辑->保存
[root@single shell]# vi three.sh
[root@single shell]# ls
three.sh
#!/bin/bash 命令开头必须要使用
:<<!
echo -n "hello kb10"
echo "hello kb11"
!
esc :x/w
#修改权限
ls -la
-rw-r--r--. 1 root root 31 Nov 23 09:06 three.sh
chmod u+x test.sh
-rwxr--r--. 1 root root 31 Nov 23 09:06 three.sh
#执行
./three.sh
shell命令
#echo [-n] "..." 控制台输出
#read VAR 控制台输入
#命令行输入
echo -n "please enter your name => "
read NAME
echo "my name is $NAME"
#控制台输出
[root@single shell]# ./three.sh
please enter your name => (王者)手动输入
my name is 王者
shell注释
#单行:#...
#多行::<<! ... !
shell变量
#变量:数字、字母、下划线、一般字母大写
#值可以是一个数字、文本、文件名、设备或任何其他类型的数据,不可以是指针
#shell可以创建,分配和删除变量
#创建
NAME="henry"
AGE=18
#使用
echo "$NAME,$AGE"
#命令
NAME="henry"
AGE=18
echo "$NAME,$AGE"
#控制台
[root@single shell]# ./three.sh
henry,18
#取消/删除
unset NAME
#命令
NAME[0]="zs"
NAME[1]="ls"
unset NAME
#控制台
[root@single shell]# ./three.sh
[root@single shell]#
常量
readonly FINAL="1001"
\#变量分类
局部变量:当前实例有效
环境变量:跨实厉访问
当前登录有效的临时环境变量
export VAR
export -f 代表[变量名称]中为函数名称
export -p #列出所有的shell赋予程序的环境变量
export -n #删除环境变量VAR变量实际上并未删除,只是不会输出到后续指令的执行环境中。
export VAR #添加环境变量VAR
shell变量命令符:
$$ 当前shell进程编号
$0 当前脚本的文件名
$n 脚本参数 如:./one.sh henry 18,则脚本中的$1为henry
$# 脚本参数得到数量 如上:2
$* 脚本参数的完整集合 如上:henry,18
$@ 脚本参数的独立集合 如上:henry,18
# $* vs $@
# 不加""两者相同
#加上""则$*代表整体,而$@代表个体
$? 上一条命令的执行结果状态值或函数的返回值;0表示正常,1表示失败1
$! The process number of the last background command.
shell数组
#标准变量:保持一个类型一值的变量
#数组:支持不同类型的变量,可以在同一时间容纳多个值
#创建赋值
NAME=(aa 18 true)
NAME[0]="henry"
NAME[1]="pola"
NAME[2]="ariel"
#使用
echo $NAME #首元素
echo ${NAME[0]} #第一个元素
echo ${NAME[1]}
echo ${NAME[2]}
echo ${NAME[*]} #所有元素
echo ${NAME[@]}
echo ${NAME[0]} #数组长度
#命令行
NAME=(aa 18 true)
NAME[0]="henry"
NAME[1]="pola"
NAME[2]="ariel"
echo $NAME
echo ${NAME[0]}
echo ${NAME[1]}
echo ${NAME[2]}
echo ${NAME[*]}
echo ${NAME[@]}
echo ${NAME[0]}
#控制台
[root@single shell]# ./three.sh
henry
henry
pola
ariel
henry pola ariel
henry pola ariel
henry
shell运算符
#算术运算符
#shell早期未设计算术,但可以在外部程序awk或expr
#expr expr与运算符和其他值之间【必须有空格】,所有的算术计算,使用整数
#*需要转译 、*
#不支持小数计算
VAL=`expr 2 + 2`
let "VAL=2**3"
VAL=$((2+3))
echo $VAL
#+ - * / % = ++ --
[ 2 == 2 ] #=>true
[ 2 != 2 ] #=>false
var=`expr 2 + 3`
#命令行输入
echo $var
var=`expr 2 - 3`
echo $var
var=`expr 2 \* 3`
echo $var
var=`expr 2 / 3`
echo $var
var=`expr 2 % 3`
echo $var
#控制台输出
[root@single shell]# ./three.sh
5
-1
6
0
2
\#关系运算符
# -eq -ne -lt -le -gt -ge
\#布尔运算符
# ! -o -a
[ 2 -lt 3 -o 5 -gt 3]
# || &&
[[ 2 < 3 || 5 > 3 ]]
\#字符串运算符
#二元:== != =~
#命令行输入
if [ $1 == "henry" ]
then
echo "is henry"
else
echo "is not henry"
fi
if [[ $1 =~ ^[0-9]+$ ]]
then
echo "is henry"
else
echo "is not henry"
fi
[[ $var =~ PATTERN ]]
不加\"
\#正则匹配
^ 开始
$ 结束
. 一个任意字符
[] 指定范围 [abc][0-9][^a-b1-9]
\< 单词开始
\> 单词结束
\b 单词开始或结束
\B 非单词开始或结束
? {0,1}
+ {1,}
* {0,}
{n,m} 最少n次,最多m次
{n,} 最少n次
{,m} 最多m次
{f} 固定f次
\ 转义符
() 组合
| 或
#一元:-z(是否为空) $str(是否不为空)
#文件测试操作(一元左置)
#-e -d -f -r -w -x -s (not empty)
#命令行输入
if [ -r $1 ]
then
echo "radeable"
else
echo "unreadable"
fi
\#特殊表达式
``<=>$() #命令替换符,兼容性``更好
OUTPUT=`start-all.sh`
先执行start命令,执行完把结果赋值给OUTPUT,默认有线程等待,延时加载
...
(()) #算术运算加强版
# && ||
# ++ -- **
$(()) <=> $[] #算术运算,$(())中变量可以加$也可以不加
[] #test命令
[[]] #字符串计算加强版
${}
${STR#*WORD}
#若STR符合WORD,将最短(WORD和左侧)的删除<=>${STR%WORD}(WORD和右侧)
#命令行输入
VAR="/opt/software/hadoop/a.txt"
VAR=${VAR%/*}
echo $VAR
#控制台输出
[root@single shell]# ./three.sh
/opt/software/hadoop
${STR##*WORD}
#若STR符合WORD,将最长(WORD和左侧)的删除<=> ${STR%WORD}(WORD和右侧)
#命令行输入
VAR="/opt/software/hadoop/a.txt"
VAR=${VAR##*/}
echo $VAR
#控制台输出
a.txt
${STR/WORD/REPLACE}
#若STR符合WORD,将第一个匹配项替换为REPLACE
#命令行输入
VAR="/opt/software/opt/a.txt"
VAR=${VAR/opt/123}
echo $VARopt
#控制台输出
[root@single shell]# ./three.sh
/123/software/opt/a.txt
${STR//WORD/REPLACE}
#若STR符合WORD,将所有匹配项替换为REPLACE
#命令行输入
VAR="/opt/software/opt/a.txt"
VAR=${VAR//opt/123}
echo $VAR
#控制台输出
[root@single shell]# ./three.sh
/123/software/123/a.txt
${STR:-DE_VALUE} #若STR未赋值或为空置,则设定STR值为DF_VALUE
#命令行输入
STR=(12)
echo ${STR:-DE_VALUE}
#控制台输出
[root@single shell]# ./three.sh
12
${ARRAY[IX]} #获取数组ARRAY下标IX的元素
#命令行输入
ARR=(henry 12 wsdf 严旭)
echo ${ARR[2]}
#控制台输出
[root@single shell]# ./three.sh
wsdf
${#ARRAY[@]} #获取数组ARRAY的长度(ITEM1 ITEM2...)
#命令行输入
ARR=(henry 12 wsdf 严旭)
echo ${#ARR[@]}
#控制台输出
[root@single shell]# ./three.sh
4
${ARRAY[*]} #整个数组
#命令行输入
ARR=(henry 12 wsdf 严旭)
echo ${ARR[*]}
#控制台输出
[root@single shell]# ./three.sh
henry 12 wsdf 严旭