#系统交互
#图形界面或命令行(dos/shell/hdfs-dfs)/程序->系统api->系统->硬件
#shell
#what
#是一个环境,提供了对linux(unix)系统的接口
#向你接受输入,并根据输入执行程序,并显示程序的输出。
#可以运行我们的命令,程序和shell脚本
#classification
#就行有不同类型的系统一样,shell也有不同版本,每个版本都有自己的一套命令和功能
#UNIX shell写于20世纪70年代中期,有斯蒂芬·伯恩。在新泽西AT&T贝尔实验室
Bourne shell . 提示符 $
C shell . 提示符 %
#shell脚本
#命令列表中列出的顺序执行
#创建->编辑->保存
vi test.shell
#!/bin/bash
...
esc :x
#修改权限
chmod u+x test.sh
#执行
./test.sh
#命令
#echo [-n] "..." 控制台输出
#read VAR 控制台输入
echo "What's your name?"
read NAME
echo "my name is $NAME"
#注释
#单行: #...
#多行: :<<! !
#变量:数字、字母、下划线,一般字母大写
#值可以是一个数字、文本、文件名、设备或任何其他类型的数据,不可以是指针
#shell可以创建,分配和删除变量
#创建
NAME="henry"
AGE=18
#使用
echo "$NAME,$AGE"
echo $NAME
#取消
unset NAME
#常量
readonly FINAL="1001"
#变量分类
局部变量:当前实例有效
环境变量:跨实例访问,就是全局变量
当前登录有效的临时环境变量
export VAR
export -p #列出所有环境变量
export -n VAR #删除环境变量VAR
export VAR #添加环境变量VAR
shell变量:
$$ 当前shell进程编号
$0 当前脚本的文件名
$n 脚本参数 如:./one.sh henry 18 ,则脚本中的$1位henry,$2位18
$# 脚本参数的数量 如上例 :2
$* 脚本参数的完整集合 如上例 : henry,18
$@ 脚本参数的独立集合 如上例 : henry,18
# $* vs $@
#不加"两者相同
#加上"则$*代表整体,而$@代表个体
$? 上一条命令的执行结果状态值或函数的返回值:0表示正常,1表示失败
$! 最后一个后台命令的进程号。
#数组
#标准变量:保持一个类型一值的变量
#数组:支持不同类型的变量,可以在同一时间容纳多个值
#创建赋值
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[*]} #数组长度
#运算符
#算数运算符
#shell早期末设计算术,但可以使用外部程序awk或expr
#expr expr与运算符和其他值之间【必须有空格】,所有的算术计算,使用长整数
#*需要转义字符\*
#不支持小数计算
VAL=`expr 2 + 2`
let "VAL=2**3"
VAL=$((2+3))
echo $VAL
# + - * / % = ++ --
[ 2 == 2 ] #=>true
[ 2 != 2 ] #=>false
#关系运算符
# -eq -ne -lt -le -gt -ge
#布尔运算符
# ! -o -a
[ 2 -lt 3 -o 5 -gt 3 ]
# || &&
[[ 2 < 3 || 5 > 3 ]]
#字符串运算符
#二元: == !=
=~
[[ $var =~ PATTERN ]]
不加\"
#正则匹配
^ 开始
$ 结束
. 一个任意字符
[] 指定范围 [abc] [a-z] [^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)
#特殊表达式
`` <==> $() #命令替换符,兼容性``更好
OUTPUT=`start-all.sh`
...
(()) #算术运算加强版
# ++ -- **
$(()) <=> $[] #算术运算,$(())中变量可以加$也可可以不加
[] #test命令
[[]] #字符串计算加强版
# && ||
${}
${STR#*WORD} #若STR符合WORD,将最短(WORD和左侧)的删除 <=> ${STR%WORD}(WORD和右侧)
${STR##*WORD} #若STR符合WORD,将最长(WORD和左侧)的删除 <=> ${STR%%WORD}(WORD和右侧)
${STR/WORD/REPLACE} #若STR符合WORD,将第一个匹配项替换为REPLACE
${STR//WORD/REPLACE} #若STR符合WORD,将所有匹配项替换为REPLACE
${STR:-DF_VALUE} #若STR未赋值或为空值,则设定STR值为DF_VALUE
${ARRAY[IX]} #获取数组ARRAY下标IX的元素
${#ARRAY[@]} #获取数组ARRAY的长度(ITEM1 ITEM2 ... ITEMN)
${ARRAY[*]} #整个数组
双引号中不能使用\
单引号中不能使用$
#日期
DATE = `date +"%Y-%m-%d %H:%M:%S"` #2020-11-24 20:11:57
DATE = `date +"%Y-%m-%d %X"` #2020-11-24 08:16:04 PM
DATETIME = `date +%S` #1606220048 秒
#命令代替
OUTPUT=`command` #先执行命令,等到命令执行结束,将结果赋值给OUTPUT后,
才会执行之后的命令,除非启动的是后台进程
#变量代替
#输入输出重定向
标准输入 System.in read NAME < 或者两个
标准输出 System.out echo /cat > 覆盖 两个>是追加
OUTPUT >或者>> FILE
#分支结果
if [ $# -eq 0 ]
then
echo “need one arguement”
exit 0
fi
TYPE="$1"
if [ $TYPE == “start” ]
then
echo “start …”
elif [ $TYPE == “stop” ]
then
echo “stop …”
elif [ $TYPE == “restart” ]
then
echo “restart …”
else
echo “not support : $1”
fi
case $1 in
1|3|5)
echo “红烧肉 ¥18.00”
;;
2|4)
echo “卤肉火烧 ¥28.00”
;;
6|7)
echo “肥牛 ¥28.00”
;;
*)
echo “非法星期 $1”
;;
esac
V=“henry pola ariel”
V=($V)
echo ${V[1]}
for val in ${V[*]}
do
echo $val
done
IX=0
while [ $IX -lt ${#V[*]} ]
do
echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {V[IX]}
((IX++))
#IX=expr $IX + 1
done
IX=1
until [ $IX -gt 10 ]
do
echo $IX
((IX++))
done
select choice in start stop restart exit
do
case $choice in
start)
echo “start …”
;;
stop)
echo “stop …”
;;
restart)
echo “restart …”
;;
exit)
echo “exited”
exit 0
;;
*)
echo “not support”
;;
esac
done
for i in seq 1 3 100
do
echo $i
done
sum1=0;sum2=0
for i in seq 1 10
do
b=
(
(
(
i
−
1
)
∗
50
+
1
)
)
e
=
(((i-1)*50+1)) e=
(((i−1)∗50+1))e=((i50))
for j in seq $b $e
do
rst1=
(
(
j
r
s
t
2
=
((j%3)) rst2=
((jrst2=((j%7))
rst3=
(
(
((
((rst1$rst2))
if [ $rst3 -ne 0 ]
then
continue
fi
if [
r
s
t
1
−
e
q
0
]
t
h
e
n
(
(
s
u
m
1
+
=
rst1 -eq 0 ] then ((sum1+=
rst1−eq0]then((sum1+=j))
fi
if [
r
s
t
2
−
e
q
0
]
t
h
e
n
(
(
s
u
m
2
+
=
rst2 -eq 0 ] then ((sum2+=
rst2−eq0]then((sum2+=j))
fi
rst=
(
(
((
((sum1+$sum2))
if [
r
s
t
−
g
e
5000
]
t
h
e
n
e
c
h
o
"
i
=
rst -ge 5000 ] then echo "i=
rst−ge5000]thenecho"i=i,j=
j
,
s
u
m
1
=
j,sum1=
j,sum1=sum1,sum2=
s
u
m
2
,
r
s
t
=
sum2,rst=
sum2,rst=rst"
break 2
fi
done
done