使用变量:
echo $your_name
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
例如:
boy="good"
echo "you are my $boyfriend" //$boyfriend值为空
改为
echo "you are my ${boy}friend"
另外:已经定义的变量可以重新定义,但是如果是只读的则不可以
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
readonly +变量名 //表示这个变量只读,不能重新赋值
删除变量
unset[空格] 变量名 (不能删除只读变量)
shell字符串
1、单引号中的内容会被当作普通字符串(java的String)来处理。
案例:
# bash
x='$LANG'
echo $x
# $LANG
2、双引号中的内容会按照其原本的属性进行输出。
案例:
# bash
x="$LANG"
echo $x
# zh_CN.UTF-8
3、可用转义字符“\”将特殊符号(如$、\、!等)变为一般字符;
your_name='chenzhe'
str="Hello, I know you are \"$your_name\"! "
echo $str
4,拼接字符串
your_name="piaolaoshi"
# 使用双引号拼接
greeting="hello, "$your_name
greeting_1="hello, ${your_name}"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' ! '
greeting_3='hello, ${your_name} ! '
echo $greeting_2 $greeting_3
5,获取字符串长度
string="abcd"
echo ${#string} #输出 4
6,获取子字符串
string="mayun is a great man"
echo ${string:1:4} # 输出ayun
shell数组
定义数组: 数组名=(值1 值2 值3 值4)
例如:
array=(1 2 3 4)
echo ${array[1]} #2
利用@可以获取元素当中的所有元素
例如
echo ${array[@]} #1 2 3 4
可以给数组单独赋值
array[1]=89
获取数组的长度
# 取得数组元素的个数
length=${#array[@]}
# 或者
length=${#array[*]}
# 取得数组单个元素的长度
array=(mayun mahuateng leijun liuqiangdong)
length=${#array[n]}
- shell传递参数
-
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
举例:
以下实例我们向脚本传递三个参数,并分别输出,其中$0为执行的文件名
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";为脚本设置可执行权限,并执行脚本,输出结果如下所示:
$ chmod +x test1.sh
$ ./test.sh 1 2 3另外,还有几个特殊字符用来处理参数:
$#
传递到脚本的参数个数
$*
以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
"piaolaohsi caolaoshi lilaoshi xiaolaosh"
$$
脚本运行的当前进程ID号
$!
后台运行的最后一个进程的ID号
$@
与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
"piaolaohsi" "caolaoshi" "lilaoshi" "xiaolaosh"
$-
显示Shell使用的当前选项,与set命令功能相同。
$?
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
#!/bin/bash
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";$* 与 $@ 区别:
#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
doneecho "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done - shell基础:
shell的概念:
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.
简单的说就是用户和内核之间进行通信/沟通的翻译官
Shell 环境
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
系统提供多种shell程序:cat /etc/shells
初见shell脚本
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh
实例:
#!/bin/bash
echo "Hello World !"
运行shell脚本的两种方法:
1
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本2
/bin/bash test.sh
shell中变量:
定义一个变量:
your_name="chenzhe"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- shell基础命令:
- find 查找命令 语法find 【path】 【选项】 参数
- 选项:-name 按文件名查找
- -perm按文件权限查找
- -size按文件的大小查找
- -user 按用户(属主)查询
- -group 按用户组查询
- -nogroup 查没有用户组的
- -mtime 按文件的修改时间来查询
- -type 按文件的类型来查找 b-块设备文件 d-目录 c-字符设备文件 p-管道文件 l-符号链接文件 f-普通文件
- 案列:
查找jdk安装的目录。find / -name java
查找当前系统中所有的.java后缀名的文件
find / -name "*.log"
查找系统中/home目录下的非普通文件
find /home ! -type f
查找当前用户/home目录下权限为700的文件
find /home -perm 700
查找/dev目录下的块设备文件
find /dev -type b
-
sed:
介绍:
sed本身是一个逐行处理工具,会逐行处理到文件的结束。默认情况下不修改源文件,因为sed是将源文件内容逐行copy到一个临时缓冲区(模式空间),对其进行编辑,行处理结束后,将其输出到屏幕上,也可以通过数据重定向将结果导入到新的文件中去。
sed本身提供修改源文件的选项。但是如果修改源文件时,结果内容并不会发送到屏幕上。
语法:
sed [option] "[action]" [filename]
选项:
-e
允许对输入数据应用多条sed命令进行编辑。
-i
表示直接操作源文件
动作:
s:
字符串匹配/查找
i:
插入
a:
追加
d:
删除
c:
替换
注意:选项和动作的字母i不是同样的功能。
案例:
源文件内容(demo):
hello teduhadoop
hello hadoop
hello hdfs ,hi sed
1、将全文的h替换为H。
# bash
sed "s/h/H/g" demo
2、修改全文的h/H,第一个l/L
# bash
sed -e "s/h/H/g" -e "s/l/L/1" demo
or
# 多条指令的另外一种写法:
sed "s/h/H/g;s/l/L/1" demo
3、修改全文的第一个和第二个h/H
# bash
sed "s/h/H/1;s/h/H/1" demo
4、部分文件中,由于不知道是第几行,且文件中存在多个相同的字符串时,如何修改。/etc/sysconfig/network-scripts/ifcfg-eth0
# eth0文件内容:
DEVICE=eth0
HWADDR=00:0c:29:37:f6:95
TYPE=Ethernet
UUID=5c4fcaf0-7f4f-4ab1-8dee-a96aecb23823
ONBOOT=no
NM_CONTROLLED=yes
BOOTPROTO=dhcp
DNS2=8.8.8.8
DNS1=114.114.114.114
IPV6INIT=no
USERCTL=no
PEERDNS=yes
将文件中的ONBOOT=no修改为ONBOOT=yes
# bash
sed -i "s/ONBOOT=no/ONBOOT=yes/g" eth0
5、在文件中进行插入新的内容:
源文件内容:
hello teduhadoop
hello hadoop
hello hdfs ,hi sed
5.1、在第一行插入内容"hello bigdata"
# bash
sed "1 i hello bigdata" demo
5.2、在第一行追加内容"hello 小强"
# bash
sed "1 a hello 小强" demo
6、删除匹配的行
# bash
sed "/hdfs/d" demo
表示将匹配的到hdfs的整行删除,如果匹配的内容是h的话,当前文件的内容会被全部删除。
grep:
这是一款强大文本搜索工具选项:
-2/-3
同时显示匹配行上下的n行
-b,--byte-offset
印匹配行前面打印该行所在的块号码。
-c,--count
只打印匹配的行数,不显示匹配的内容。
-i,--ignore-case
忽略大小写差别。
-q,--quiet
取消显示,只返回退出状态。0则表示找到了匹配的行。
--color
将匹配内容上色区分
-n,--line-number
在匹配的行前面打印行号。
-v,--revert-match
反检索,只显示不匹配的行。
#bash
cd /home
ls |grep -2 shell #匹配上下两行
ls |grep -n log #匹配行号
ls | grep log --color
tail:文本监控,通常情况下用于监视文件的增长。
场景:
大数据环境中,很多软件在启动时,不会将真正的启动/过程日志打印在屏幕上,因为内容繁多,会影响程序员观察启动过程中,哪个进程没有启动。像此种场景,我们就可以利用tail工具用来监视该软件启动日志文件的实际内容。
语法:
tail [选项] fileName
选项:
-f
用于监控文件的增长!!!
-n
从指定的行中进行监控文件的内容
cut:
cut命令在文件中负责剪切数据用的
选项:
-b
字节
-c
字符
-f
提取第几列
-d
按指定分隔符分割列
案例:
源文件内容:
192.168.1.1
192.168.1.3
192.168.1.5
192.168.1.4
截取第11个字节:
# bash
cut -b 11 demo
截取第7-9的字节
# bash
cut -b 7-9 demo
截取最后一个字节进行排序:
# bash
cut -b 11 demo | sort
以点为 分隔符 获取第二个字段
# bash
cut -d . -f 2 demo
历史命令:
history
该命令可以用来查看Linux系统中曾经执行过的命令(默认1000条)。
用法:
!!
运行上一条命令
!88
运行第88条命令
!88 /test
运行第88条命令并在命令后面加上/test (可以用ls举例)
!ls
运行上一个ls命令
!ls:s/CF/l
运行上一个ls命令,其中把CF替换成l
history -c
表示清除历史命令 # 学习阶段不要使用此命令,会清空历史命令,不利于学习
if判断
2019年5月18日
15:46
条件判断语句:
语法:
if语法
#!/bin/bash
a=10
b=10
if [ $a -eq $b ];then
echo "两个数相等"
fi
if else语法
#!/bin/bash
string="hello"
string1="HELLO"
if test $string = $string1
then
echo "两个字符串一样"
else
echo "两个字符串不一样"
fi
if else-if else语法
以下实例判断两个变量是否相等:
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fitest判断:
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
数值测试
参数
说明
-eq
等于则为真
-ne
不等于则为真
-gt
大于则为真
-ge
大于等于则为真
-lt
小于则为真
-le
小于等于则为真
实例演示:
#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi字符串测试
参数
说明
=
等于则为真
!=
不相等则为真
-z 字符串
字符串的长度为零则为真
-n 字符串
字符串的长度不为零则为真
实例演示:
#!/bin/bash
num1="chenzhe"
num2="chenzhe1"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi文件测试
参数
说明
-e 文件名
如果文件存在则为真
-r 文件名
如果文件存在且可读则为真
-w 文件名
如果文件存在且可写则为真
-x 文件名
如果文件存在且可执行则为真
-s 文件名
如果文件存在且至少有一个字符则为真
-d 文件名
如果文件存在且为目录则为真
-f 文件名
如果文件存在且为普通文件则为真
-c 文件名
如果文件存在且为字符型特殊文件则为真
-b 文件名
如果文件存在且为块特殊文件则为真
实例演示:
#!/bin/bash
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:
#!/bin/bash
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi运算符
0:24
Shell 和其他编程语言一样,支持多种运算符,包括:
算数运算符 关系运算符fi
算术运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
运算符
说明
举例
+
加法
`expr $a + $b` 结果为 30。
-
减法
`expr $a - $b` 结果为 -10。
*
乘法
`expr $a \* $b` 结果为 200。
/
除法
`expr $b / $a` 结果为 2。
%
取余
`expr $b % $a` 结果为 0。
=
赋值
a=$b 将把变量 b 的值赋给 a。
==
相等。用于比较两个数字,相同则返回 true。
[ $a == $b ] 返回 false。
!=
不相等。用于比较两个数字,不相同则返回 true。
[ $a != $b ] 返回 true。
实例
#!/bin/bash`
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
乘号(*)前边必须加反斜杠(\)才能实现乘法运算;`expr $a + $b` 等价于 $(($a+$b))
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符
说明
举例
-eq
检测两个数是否相等,相等返回 true。
[ $a -eq $b ] 返回 false。
-ne
检测两个数是否不相等,不相等返回 true。
[ $a -ne $b ] 返回 true。
-gt
检测左边的数是否大于右边的,如果是,则返回 true。
[ $a -gt $b ] 返回 false。
-lt
检测左边的数是否小于右边的,如果是,则返回 true。
[ $a -lt $b ] 返回 true。
-ge
检测左边的数是否大于等于右边的,如果是,则返回 true。
[ $a -ge $b ] 返回 false。
-le
检测左边的数是否小于等于右边的,如果是,则返回 true。
[ $a -le $b ] 返回 true。
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo " a 等于 b"
else
echo " a 不等于 b"
fi
if [ $a -gt $b ]
then
echo "a 大于 b"
else
echo "a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "a 不小于 b"
fi
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符
说明
举例
&&
逻辑的 AND
[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||
逻辑的 OR
[[ $a -lt 100 || $b -gt 100 ]] 返回 true
实例
逻辑运算符实例如下:
实例
#!/bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
运算符
说明
举例
=
检测两个字符串是否相等,相等返回 true。
[ $a = $b ] 返回 false。
!=
检测两个字符串是否相等,不相等返回 true。
[ $a != $b ] 返回 true。
-z
检测字符串长度是否为0,为0返回 true。
[ -z $a ] 返回 false。
-n
检测字符串长度是否为0,不为0返回 true。
[ -n "$a" ] 返回 true。
$
检测字符串是否为空,不为空返回 true。
[ $a ] 返回 true。
实例
字符串运算符实例如下:
实例
#!/bin/bash
a="abc"
b="efg"
if [ $a = $b ]
then
echo "a 等于 b"
else
echo " a 不等于 b"
fi
if [ -z $a ]
then
echo "字符串长度为 0"
else
echo " 字符串长度不为 0"
fi
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符
说明
举例
-b file
检测文件是否是块设备文件,如果是,则返回 true。
[ -b $file ] 返回 false。
-c file
检测文件是否是字符设备文件,如果是,则返回 true。
[ -c $file ] 返回 false。
-d file
检测文件是否是目录,如果是,则返回 true。
[ -d $file ] 返回 false。
-f file
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
[ -f $file ] 返回 true。
-g file
检测文件是否设置了 SGID 位,如果是,则返回 true。
[ -g $file ] 返回 false。
-k file
检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
[ -k $file ] 返回 false。
-p file
检测文件是否是有名管道,如果是,则返回 true。
[ -p $file ] 返回 false。
-u file
检测文件是否设置了 SUID 位,如果是,则返回 true。
[ -u $file ] 返回 false。
-r file
检测文件是否可读,如果是,则返回 true。
[ -r $file ] 返回 true。
-w file
检测文件是否可写,如果是,则返回 true。
[ -w $file ] 返回 true。
-x file
检测文件是否可执行,如果是,则返回 true。
[ -x $file ] 返回 true。
-s file
检测文件是否为空(文件大小是否大于0),不为空返回 true。
[ -s $file ] 返回 true。
-e file
检测文件(包括目录)是否存在,如果是,则返回 true。
[ -e $file ] 返回 true。
实例
变量 file 表示文件/root/install.log,它的大小为 100 字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:
实例
#!/bin/bash
file="/root/install.log"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -f $file ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
if [ -d $file ]
then
echo "文件是个目录"
else
echo "文件不是个目录"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
文件测试运算符 字符串运算符 布尔运算符
- find 查找命令 语法find 【path】 【选项】 参数