Shell

Shell编程

什么是shell

shell是命令解析器,是Unix操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序以及输入翻译成操作系统内核(kernel)能够识别的指令,并且操作系统内核执行完返回输出通过shell呈现给用户。
在这里插入图片描述
在这里插入图片描述
Shell也是一门编程语言,即Shell脚本。shell是一种解释执行的脚本语言,可以直接调用Linux命令。不同于Java在执行前需要编译。

一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的Shell,不同的shell可能支持的命令语法是不同的。
在这里插入图片描述
操作系统内核(kernel)与shell是独立的套件,而且都可被替换
1.不同的操作系统使用不同的shell;
2.同一个kernel之上可以使用不同的shell。

常见的shell分为两大主流:
sh:
Bourne shell(sh) ,Solaris,hpux默认shell
Bourne again shell(bash) ,Linux系统默认shell
csh:
C shell(csh)
tc shell(tcsh)

查看当前环境使用的shell

在这里插入图片描述

查看树形图

在CentOS7中使用pstree需要安装psmisc命令
在这里插入图片描述
使用pstree查看树形图
在这里插入图片描述

shell环境定义

临时环境变量

所谓的临时变量是指在用户在当前登录环境生效的变量,用户登录系统后,直接在命令行上定义的环境变量便只能在当前的登录环境中使用
在这里插入图片描述

环境变量永久生效

通过将环境变量定义写入到配置文件中,用户每次登陆时系统自动定义,则无需再到命令行重新定义。定义环境变量的常见配置文件如下:
1./etc/profile 针对系统所有用户生效,此文件应用于所有用户每次登录系统时的环境变量定义。
2. H O M E n a m e / . b a s h p r o f i l e 针 对 特 定 的 用 户 生 效 , HOME_name/.bash_profile 针对特定的用户生效, HOMEname/.bashprofileHOME为用户的宿主目录,当用户登录系统后首先继承/etc/profile文件中的定义,再应用$HOME/.bash_profile中的定义。

系统中预定义的环境变量

系统环境变量对所有用户有效,如: P A T H , PATH, PATH,HOME,$PWD等。
在这里插入图片描述

shell脚本编程

创建Shell脚本

一个shell脚本通常包含如下部分

首行:第一行内容在脚本的首行左侧,表示脚本将要调用的shell解析器,内容如下:
#!/bin/bash
#! 符号能够被内核识别成是一个脚本的开始,这一行必须位于脚本的首行,/bin/bash是bash程序的绝对路径,在这里表示后续的内容将通过bash解析执行。
注释:注释符号#需要放在每一行的开头。
内容:可执行内容和shell结构

创建shell脚本的三种方式

在这里插入图片描述

Shell脚本的执行

在这里插入图片描述
1.输入脚本的绝对路径和相对路径
/root/helloWord.sh ./helloWord.sh
在这里插入图片描述
2.bash或sh+脚本
bash /root/helloWord.sh sh helloWord.sh 注:当脚本没有执行权的时候,root和所有者可以通过该方式执行脚本
在这里插入图片描述
3.在脚本前面加"." 或 source
source /root/helloWord.sh . ./helloWord.sh
区别:第一种和第二种方式会新开一个bash,不同bash中的变量无法共享,但是使用…/脚本.sh 这种方式会在同一个shell中执行。
shell中的变量:是shell中传递数据的一种方式,当shell中需要保存一些信息时,就保存到变量中。
在这里插入图片描述

shell变量

变量设置规则:

1,变量名称可以由字母,数字和下划线组成,但是不能以数字开头,环境变量名建议大写,便于区分。
2,在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
3,变量用等号连接值,等号左右两侧不能有空格。
4,变量的值如果有空格,需要使用单引号或者双引号包括。
在这里插入图片描述
在这里插入图片描述
变量的分类:自定义变量,系统变量,位置参数变量,预定义变量。
通过set查看所有变量
在这里插入图片描述

位置参数变量

$n:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十个以上的参数需要使用大括号包含。
$:代表命令行中所有的参数,把所有的参数看成一个整体,以"$1 $2 $3 $4"的形式输出所有的参数。
$@:代表命令行中的所有参数,把每个参数区分对待,以"$1
$2*…$3*"的形式输出所有参数
$#:代表命令行中所有参数的个数,添加到shell的参数个数。
shift:参数左移;

#!/bin/bash
#this is my first sh script
echo '$0='$0
echo '$1='$1
echo '\$2='$2

echo "\$*="$*
echo "\$@="$@
echo "\$#="$#

echo "\$*"
for i in $*
do 
echo $i
done

echo "\$@"
for i in $*
do 
echo $i
done

echo "*"
for i in "$*"
do 
echo $i
done

echo "@"
for i in "$@"
do 
echo $i
done

执行结果:
在这里插入图片描述

#!/bin/bash
# this is my first sh script
echo '$0='$0
echo '$1='$1
echo '\$2='$2

shift
echo "\$*="$*
echo "\$@="$@
echo "\$#="$#

执行结果:
在这里插入图片描述

预定义变量

$?:执行上一个命令的返回值,执行成功返回0,执行失败返回非0数;
$$:当前进程的进程号,即当前脚本生成的进程号。
$!:后台运行最后一个进程的进程号,最近被放入后台执行的进程。 把程序放在后台执行:命令+&
在这里插入图片描述
在这里插入图片描述

变量赋值:

1.定义赋值 A=9
2.将一个命令的执行结果赋值给另外一个变量 A=ls -a A= ( l s − l a ) a a a = (ls -la) aaa= (lsla)aaa=((4+5)) bb=expr 4 + 5
3.将一个变量赋给另一个变量 A= S T R c c = " STR cc=" STRcc="aa"456 dd=${aa}789
单引号和双引号的效果不同,单引号中的内容会全部输出,双引号中的内容会发生改变。

read命令

read [选项] 值
read -p(提示语句) -n(字符个数) -t(等待时间,单位为秒) -s(隐藏输入)

#!/bin/bash
read -t 30 -p "please input your name:" name age
echo $name $age
read -t 30 -sp "input your age:" age
echo $age
read -t 30 -n 1 -p "input your gender[m|f]:" gender
echo $gender

执行结果:
在这里插入图片描述

运算符

格式:expr m + n 或$((m + n)) 注意:expr运算符中间要有空格
expr命令:对整数型变量进行算术运算
eg:expr 3 + 5
echo expr 10 / 3
echo expr 3 \* 3
sum=expr \expr 3 + 2` * 5 `
( ( ( 3 + 2 ) ∗ 5 ) ) ∗ ∗ (((3 + 2) * 5)) ** (((3+2)5))()与 的 区 别 ∗ ∗ : {}的区别**: ()的用途和反引号"一样,用来表示优先执行的命令;
eg:echo $(ls a.txt) ${}就是取变量了;
eg:echo ${PATH} $((运算内容))适用于数值运算;

条件判断 (test 或 [])

内置test命令常用操作符号[]表示,将表达式写在[]中,如下:
[ expression ]
或者:
test expression
注意:expression首尾都有个空格
字符串测试
test str1 == str2 判断字符串是否相等
test str1 != str2 判断字符串是否不相等
test str1 判断字符串是否为空
test -n str1 测试字符串是否为空
test -z str1 测试字符串是否不为空
整数测试
test int1 -eq int2(==)
test int1- -ge int2(>=)
test int1 -gt int2(>)
test int1 -le int2(<=)
test int1 -lt int2(<)
test int1 -ne int2(!=)
文件测试
test -d file 指定文件是否是目录
test -e file 文件是否存在
test -f file 指定文件是否是常规文件
test -L file 文件存在并且是一个符号连接
test -r file 指定文件是否可读
test -w file 指定文件是否可写
test -x file 指定文件是否可执行
在这里插入图片描述
多重条件测试
条件1 -a 条件2 逻辑与 两个都成立则为真。
条件1 -o 条件2 逻辑或 两个只要有一个成立则为真
!条件 逻辑非 取反
eg: num=520
[ -n “ n u m &quot; − a &quot; num&quot; -a &quot; num"a"num” -ge 520 ] && marry you || echo go on

流程控制语句

if条件语句:

if [ 条件判断式 ]
then
程序
fi
或者
if [ 条件判断式 ] ; then
程序
fi
注意:if语句使用fi结尾,和一般语言使用大括号结尾不同;中括号和条件判断式之间必须有空格。then后面跟符号条件之后执行的程序,可以放在[]之后,用";“分隔,也可以换行写入,就不需要”;"

多分支if条件语句:

if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
…省略更多条件
else
当所有条件都不成立时,最后执行此程序
fi
eg:
#!/bin/bash
read -p “please input your name:” NAME
#echo N A M E i f [ &quot; NAME if [ &quot; NAMEif["NAME" == root ]
then
echo “hello ${NAME}, welcome!”
elif [ $NAME == tom ]
then
echo “hello ${NAME}, welcome!”
else
echo “SB,get out here!”
fi
在这里插入图片描述

case命令:

case命令是一个多分支的if/else命令,case变量的值用来匹配value1,value2,value3等等。匹配到后则执行跟在后面的命令直到遇到双分号为止(;;)case命令以esac作为终止符。
格式:
CMD=$1
case $CMD in
start)
echo “starting”
;;
stop)
echo “stoping”
;;
*)
echo "Usage:{start|stop} "
esac
在这里插入图片描述

for循环:

第一种:
for N in 1 2 3
do
echo $N
done

for N in 1 2 3; do echo $N; done

for N in {1…3}; do echo $N; done
第二种:
for (( i=0; i <= 5; i++))
do
echo “welcome $i times”
done

for ((i=0; i <= 5; i++)); do echo “welcome $i times”; done
在这里插入图片描述

while循环

练习:求1-10各个数的平方和
num=1
while [ $num -le 10 ]
do
SUM=expr $num \* $num
echo $SUM
num=expr $num + 1
done
num=1
while [ n u m − l e 10 ] d o s u m = num -le 10 ] do sum= numle10]dosum=(( $sum * $sum))
echo s u m n u m = sum num= sumnum=(( n u m + 1 ) ) d o n e i = 1 w h i l e ( ( i &lt; = 10 ) ) d o s u m = num + 1 )) done i=1 while(( i &lt;= 10 )) do sum= num+1))donei=1while((i<=10))dosum=(( $i * $i ))
echo s u m i = sum i= sumi=(( $i + 1 ))

自定义函数

函数代表着一个或一组命令的集合,表示一个功能模块,常用于模块化编程。
说明:在shell中,函数必须先定义,再调用;使用return value来获取函数的返回值;函数在当前shell中执行,可以使用脚本中的变量。
格式:
函数名()
{
命令1…
命令2…
return 返回值变量
}
[ function ] funname [()]
{
action;
[return int;]
}
注意:如果函数名没有(),在函数名和{之间,必须要有空格以示区分。函数返回值,只能通过$?系统变量获得,可以显示加:return返回值,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

#!/bin/bash
function start(){
        echo "starting"
        service httpd start
}
stop(){
        echo '$#='$#
        echo "stopping"
        service httpd stop
        return "123"
}
restart(){
        echo "restarting"
        service httpd restart
        return "abc"
}
stop

执行结果
在这里插入图片描述

awk和sed

cut

cut [选项] 文件名 默认分隔符是制表符
选项: -f 列号: 提取第几列
-d 分隔符: 按照指定分隔符分割列
eg:#cut -f 2 aa.txt 提取第二列
eg:#cut -d “:” -f 1,3 /etc/passwd 以:分割,提取第1和第3列
eg:#cat /etc/passwd | grep /bin/bash | grep -v root | cut -d “:” -f 1 获取所有可登录的普通用户和用户名
cut的局限性:不能分割空格(必须指定空格的个数,不够灵活)
在这里插入图片描述
在这里插入图片描述

awk

awk一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
语法:awk ‘条件1 {动作1} 条件2 {动作2}…’ 文件名
一般使用关系表达式作为条件:> >= <=等
动作:格式化输出,流程控制语句
eg:#df -h | awk ‘{print $1 “\t” $3}’ 显示第一列和第三列
在这里插入图片描述
printf不会换行
在这里插入图片描述
** FS内置变量 **
eg:#cat /etc/passwd | grep “/bin/bash” | awk ‘BEGIN {FS=":"} {print $1 “\t” $3 }’ 输出可登陆用户的用户名和UID,这里使用FS内置变量指定分隔符为:,而且使用BEGIN保证第一行也操作,因为awk命令会在读取第一行后再执行条件
指定分隔符还可以用-F更简单
在这里插入图片描述
eg:# cat /etc/passwd | grep “/bin/bash” | awk -F: ‘{print $1 “\t”$3 }’ 效果同上
BEGIN 在所有数据读取之前执行
eg:#awk ‘BEGIN {printf “first Line \n”} {printf $2 }’ aa.txt 在输出之前使用BEGIN输出内容
END 在所有数据执行之后执行
eg:#awk ‘END {printf “The End \n”} {print $2}’ aa.txt 所有命令执行完后,输出一句"The End"
获取所有用户信息里的用户名:
cat /etc/passwd | awk -F: ‘{print $1}’
awk -F: ‘{print $1}’ /etc/passwd
获取当前机器的ip地址:
ifconfig eth0 | grep ‘inet addr’ | awk -F: ‘{print $2}’ | awk ‘{print $1}’

sed

sed:stream editor
s e d是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可 能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。
注意: sed 并不与初始化文件打交道, 它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。
语法:sed [选项] ’ [动作] ’ 文件名
-n:使用安静模式。显示经过sed特殊处理的数据。
-e:允许多点编辑。
-i:直接修改读取的文档内容,而不是由屏幕输出。
a:新增,a的后面可以接字串,在下一行出现
c\:替换
d:删除
i:插入,i的后面可以接字串
p:打印
s:查找并替换,
eg:
sed ‘2p’ sed.txt 显示第二行和所有数据
sed -n ‘2,3p’ sed.txt 显示第二和第三行
df -h | sed -n ‘1p’ 接收命令结果数据
sed ‘2a liuyifei’ sed.txt 在第二行后面添加数据
sed ‘4i fengjie
aaaaa’ sed.txt 在第4行之前添加两行数据
sed ‘2c this is replace’ sed.txt 替换第二行数据
sed ‘s/it/edu360/g’ sed.txt 把sed.txt文件中的it替换为edu360,并输出
sed -e ‘1s/1/34/g;3s/yangmi//g’ sed.txt 同时进行多个替换
sed -i ‘/s/it/edu360/g’ sed.txt 想要真正的替换,需要使用-i参数。

定时器

crontab 命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab 文件来保存调度信息。可以使用它运行任意一个 shell 脚本或某个命令。
crontab命令格式
作用:用于生成cron进程所需要的crontab文件
crontab的命令格式
crontab -e 使用编辑器编辑当前的crontab文件。
crontab文件格式
minute hour day-of-month month-of-year day-of-week commands
分< >时< >日< >月< >星期< >要运行的命令 < >表示空格
其中
Minute 一小时中的哪一分钟 [0~59]
hour 一天中的哪个小时 [0~23]
day-of-month 一月中的哪一天 [1~31]
month-of-year 一年中的哪一月 [1~12]
day-of-week 一周中的哪一天 [0~6] 0表示星期天
commands 执行的命令

书写注意事项
1,全都不能为空,必须填入,不知道的值使用通配符*表示任何时间
2,每个时间字段都可以指定多个值,不连续的值用,间隔,连续的值用-间隔。
3,命令应该给出绝对路径
4,用户必须具有运行所对应的命令或程序的权限

输入输出重定向

:输出重定向,会替换

:输出重定向,不会替换,会累加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值