文章目录
I know, i know
地球另一端有你陪我
shell
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell是用户与Linux操作系统沟通的桥梁
1、脚本
如何创建
执行文件后缀为 .sh
vim fgh.sh
文件头为:#!/bin/bash
或:#!/bin/sh
如何运行
1、bash fgh.sh
2、sh fgh.sh
3、文件修改为可执行文件后(不可直接执行)
./fgh.sh
2、命令
1、输出
echo “输出内容”
echo "helloworld"
输出结果:helloworld
2、普通变量
变量不需要声明,初始化不需要指定类型,均为 String 类型
变量命名
1:只能使用数字,字母和下划线,且不能以数字开头
2:变量名区分大小写
3:建议变量的名称要通俗易懂
注意:变量赋值是通过等号(=)进行赋值,在变量、等号和值之间不能出现空格
显示变量值使用echo命令,加上$变量名,也可以使用${变量名}
f=1 g=2 h=3
echo fgh
echo $fgh
echo $f$g$h
echo ${
f}${
g}${
h}
echo ${
f}and${
g}or${
h}
输出结果:fgh //无法直接识别变量名
//此处会匹配变量 fgh,但实际上并无
123 //正确格式
123 //正确格式
1and2or3 //混合显示格式
3、位置变量
是 shell 中预置的变量,类似函数中的形参,可以在调用函数时赋值
$1,$2,…${10}…
赋值方法:fgh.sh 1 2 3 …
$0:固定脚本自身,类似静态变量
$1:脚本的第一个参数
$2:脚本的第二个参数
echo "$0"
echo "$1"
echo "$2"
echo "$3"
echo "$10"
echo "${10}"
echo "${*}"
echo "${#}"
sh fun3.sh a b c d e f g h i j k l
输出结果:fun3.sh //$0 的结果
a //$1
b //$2
c //$3 之后数据会被保存于对应位置变量
a0 //$10 = $1 + "0"
j //想要正确对应,需要使用大括号
a b c d e f g h i j k l //* 输出全部变量
12 //# 显示个数,不包括 $0
4、字符串操作
单引号:变量,转义符等均转换为字符串
双引号:允许变量和转义符的存在
作为引用符号时,二者均必须成对存在
fgh=123
echo 'fgh' '${fgh}' '"'
echo "fgh" "${fgh}" "'" "\"'${fgh}'\""
输出结果: fgh ${fgh} ' "'123'"
fgh 123 "
字符串长度
fgh="abcd"
echo ${
#fgh}
输出结果:4
字符串截取
${字符串:值1:值2}
值1代表起始下标,值2代表截取长度
fgh="abcd1234"
echo ${
fgh:2:4}
输出结果:cd12
字符串替换
${字符串/旧字符串1/新字符串2} 替换单个
${字符串//旧字符串1/新字符串2} 替换多个
替换后原字符串不会发生改变
fgh=abcdabcd1234
echo ${
fgh/abcd/1234}
echo ${
fgh//abcd/1234}
a=${
fgh/1234/abcd}
echo ${
fgh}
echo ${
a}
输出结果: 1234abcd1234 //替换单个
123412341234 //替换多个
abcdabcd1234 //原字符串不改变
abcdabcdabcd //可以用新字符串接收
字符串删除
${字符串#表达式} 从头开始匹配一次
${字符串##表达式} 从头开始匹配最后一个
${字符串%表达式} 从尾开始匹配一次
${字符串%%表达式} 从尾开始匹配最后一次
删除后原字符串不会发生改变
fgh=abcabc123123
echo 'fgh =' ${
fgh}
echo '#*abc:' ${
fgh#*abc}
echo "##*abc:" ${
fgh##*abc}
echo '%123*:' ${
fgh%123*}
echo '%%123*:' ${
fgh%%123*}
输出结果: fgh = abcabc123123
#*abc: abc123123 //左起匹配单个
##*abc: 123123 //左起匹配最后一个
%123*: abcabc123 //右起匹配单个
%%123*: abcabc //右起匹配最后一个
5、基本运算符
a=1 b=2
echo '2+2 =' `expr 2+2`
echo '2 + 2 =' `expr 2 + 2`
echo 'b/a =' `expr ${
b} / ${
a}`
echo '2+2 =' $[2+2]
echo 'a+b =' $[a+b]
echo '1>2' $[1>2]
echo '1<2' $[1<2]
echo '3>2 & 4>3' $[3>2 & 4>3]
echo '![3>2 | 4>3]' $[!$[3>2 | 4>3]]
输出结果: 2+2 = 2+2 // expr 运算符左右需要空格
2 + 2 = 4 //正确结果
b / a = 2 //变量需要 ${}
2+2 = 4 // $[] 不需要考虑空格
a+b = 3 // $[] 变量也可以知己使用
1>2 0 //假为 0
1<2 1 //真为 1
3>2 & 4>3 1 // and
![3>2 | 4>3] 0 // or 需要整体括住
6、if 语句
a=3 b=2
if [ 4 \< 3 ]
then
echo 'true'
else
echo 'false'
fi
if [[ 4 < 3 ]]
then
echo 'true'
else
echo 'false'
fi
if ((a>b))
then
echo 'true'
else
echo 'false'
fi
输出结果: false // [] 中,字符之间需要隔开,比较符需要转义,变量需要${}
false // [[]] 中,字符之间需要隔开,变量需要${}
true // (()) 中,不需要隔开,不需要转义,变量可以直接引用
7、for 语句
jsum=0
osum=0
for ((i=1;i<=100;i++))
do
if ((i%2==0))
then
#osum=`expr $osum + $i`
#osum=$[osum+i]
let osum+=i
else
jsum=`expr $jsum + $i`
fi
done
echo $jsum
echo $osum
for ((i=1;i<=3;i++))
do
for ((j=1;j<=i;j++))
do
echo -n '*'
done
echo ''
done
输出结果: 2500
2550 //let 后可以使用 java 语句逻辑
*
**
*** //echo -n 不输出换行符
第二种写法
a=1 b=100
#for i in {1..100}
for i in `seq $a $b`
do
echo $i
done
8、数组
sum=0
arr=(1 2 3 4 5 6)
echo $arr
echo ${
arr[*]}
echo ${
#arr[*]}
for((i=1;i<=${
#arr[*]};i++))
do
let sum+=arr[i]
done
echo $sum
输出结果: 1 // 直接输出变量会输出首元素
1 2 3 4 5 6 // * 输出全部
6 // # 输出长度
20 // 输出和
9、键盘录入
read a b c d
echo $a
echo $b
echo $c
echo $d
录入:1 2 3 4 5 (空格分开)
输出结果:1
2
3
4 5 //最后输入的值会一并赋予最后的变量
10、函数
[ function ] funname [()]
{
action;
[return int;]
}
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、必有参数返回,可以显示加:return n(0-255,超过会从0重新计算,补码
如果不加,将以最后一条命令运行结果,作为返回值
fun(){
a=1
b=2
x=$[a+b]
return $x;
}
fun
echo $?
echo $?
输出结果: 3 // $? 可以接收返回值
0 //第二个将继续向上接收,此处是 fun 方法运行是否成功,成功为 0
fun(){
a=$1
b=$2
x=$[a+b]
echo $0
echo $x
}
fun 1 2
输出结果: funfun2.sh // $0 可以理解为静态变量,无论何时都是脚本的输出
3 //此处的位置变量是 fun 的,需要在内部分配值
11、日期
获取当前日期时间
date +"%Y-%m-%d %H:%M:%S"
格式化日期时间:
date -d today +"%Y-%m-%d %H:%M:%S"
关于如何通过编号按照周分组的
可以通过编号的集体 -1,再对7获得商
12、重定向
正常情况下,shell 中的输入来自键盘录入的指令,输出的位置是用户的控制台(屏幕)
通过特定的符号,可以将输出位置选择为特定的其他位置
当执行shell命令时,会默认打开3个文件:
标准输入 描述符:0 从键盘获得输入
标准输出 描述符:1 输出到屏幕(即控制台)
错误输出 描述符:2 输出到屏幕(即控制台)
命令 | 介绍 |
---|---|
command > filename | 把标准输出重定向到新文件中 |
command 1> filename | 同上 |
command >> filename | 把标准输出追加到文件中 |
command 1>> filename | 同上 |
command 2> filename | 把标准错误重定向到新文件中 |
command 2>> filename | 把标准错误追加到新文件中 |
command > filename 2>&1 | 把标准输出和错误输出重定向到新文件中 |
控制台录入
touch aaa
touch ccc
1、 ll aaa bbb > ccc
2、 ll aaa bbb 1> ccc
3、 ll aaa bbb 2> ccc
4、 ll aaa bbb > ccc 2>&1
输出结果: 1、ls: 无法访问bbb: 没有那个文件或目录 标准输出重定向
2、ls: 无法访问bbb: 没有那个文件或目录 标准输出重定向
3、-rw-r--r--. 1 root root 0 11月 4 19:36 aaa 错误输出重定向
4、(空) 标准和错误输出重定向
13、定时器
定义 write.sh
'helloworld'>>/tmp/fgh/fun/test.txt
控制台输入
crontab -e
* * * * * sh /tmp/fgh/fun/write.sh
五个 * 分别代表
分钟 小时 几号 月份 星期
* * * * * 代表每分钟
1 * * * * 代表每小时的第1分钟
*/5 * * * * Command 每5分钟执行
0 */2 * * * Command 每2小时执行