Linux打印工程运行文件变量,linux学习笔记--工程师技术:shell脚本基础

Shell脚本

脚本:可以执行文件,运行后可以实现某种功能(命令的堆积,非交互)

规范Shell脚本的一般组成

#! 环境声明(Sha-Bang)

# 注释文本

可执行代码

#!/bin/bash   #环境声明,声明写的脚本是bash这个程序翻译的

一、书写第一脚本程序

[root@server0 ~]# vim /root/1.sh

#!/bin/bash

echo hello world

hostname

cat  /etc/redhat-release

ifconfig | head -2  | tail -1

[root@server0 ~]# /root/1.sh

二、书写为Server0自动搭建Yum的脚本

[root@server0 ~]# vim /root/yum.sh         #要注意排版,echo里的内容要顶行写,echo 后的'要在同一行

#!/bin/bash

rm -rf /etc/yum.repos.d/*

echo '[dvd]

name=dvd

baseurl=http://172.25.254.254/content/rhel7.0/x86_64/dvd/

enabled=1

gpgcheck=0'  > /etc/yum.repos.d/haha.repo

yum clean all

yum repolist

[root@server0 ~]# /root/1.sh       #显示权限不够,因为vim下写的都是普通的文本,需要赋予x执行权限

-bash: /root/1.sh: 权限不够

[root@server0 ~]# chmod +x /root/yum.sh

[root@server0 ~]# /root/yum.sh

管道传递

使用 | 管道操作

– 将前一条命令的标准输出交给后一条命令处理

三、重定向输出

>:只收集前面命令的正确输出,错误的显示在命令行

2>:只收集前面命令的错误输出,正确的显示在命令行

&>:收集前面命令的错误与正确输出,不显示在命令行

[root@server0 ~]# echo 123 > /opt/1.txt

[root@server0 ~]# cat /opt/1.txt

123

[root@server0 ~]# cat /opt/1.txt /etc/

cat: /etc/: 是一个目录

[root@server0 ~]# cat /opt/1.txt /etc/ > /opt/a.txt

cat: /etc/: 是一个目录

[root@server0 ~]# cat /opt/a.txt

123

[root@server0 ~]# cat /opt/1.txt /etc/ 2> /opt/a.txt

123

[root@server0 ~]# cat /opt/a.txt

123

[root@server0 ~]# cat /opt/1.txt /etc/ &> /opt/a.txt    #不显示

[root@server0 ~]# cat /opt/a.txt

123

cat: /etc/: 是一个目录

-------------------------------------------------------------------------------------------

三、书写创建用户并设置密码的脚本

[root@server0 ~]# vim /root/user.sh

#!/bin/bash

useradd test06

echo 123 | passwd --stdin test06

[root@server0 ~]#  chmod +x /root/user.sh

[root@server0 ~]# /root/user.sh

更改用户 test06 的密码 。

passwd:所有的身份验证令牌已经成功更新。

要使其不显示信息

/dev/null  #Linux黑洞设备,专用于收集不要的输出结果

[root@server0 ~]# vim /root/user.sh

#!/bin/bash

useradd test06 &> /dev/null

echo test06创建成功

echo 123 | passwd --stdin test06 &> /dev/null

echo test06密码设置成功

[root@server0 ~]#  chmod +x /root/user.sh

[root@server0 ~]# /root/user.sh

test06创建成功

test06密码设置成功

变量:为了增加脚本的适用环境的能力,增加脚本的灵活度,方便。

变量: 容器,以不变的名称,储存变化的值

变量名=变化的值

使用变量:    $变量名

为了降低脚本使用难度,可以产生交互

read :可以产生交互,将键盘输入的内容赋值给变量

[root@server0 ~]# vim /root/user.sh

#!/bin/bash

read  -p  '请输入您要建立的用户:'   user

read  -p  '请输入您要设置的密码:'   pass

useradd  $user  &> /dev/null

echo $user创建成功

echo $pass | passwd --stdin $user &> /dev/null

echo $user密码设置成功

[root@server0 ~]# /root/user.sh

请输入您要创建的帐号:kobe

请输入您要设置的密码:248

kobe创建成功

kobe密码设置成功

-------------------------------------------------------------------------------------------

什么是变量

以不变的名称存放的可能会变化的值

– 变量名=变量值

– 方便以固定名称重复使用某个值

– 提高对任务需求、运行环境变化的适应能力

设置变量时的注意事项

– 若指定的变量名已存在,相当于为此变量重新赋值

– 等号两边不要有空格

– 变量名由字母/数字/下划线组成,区分大小写

– 变量名不能以数字开头,不要使用关键字和特殊字符

基本格式

– 引用变量值:$变量名

– 查看变量值:echo $变量名,echo ${变量名}

变量的种类

位置变量

在执行脚本时提供的命令行参数(非交互式传值)

$加数字($1、$2、$3.....):脚本文件名后面带有参数的默认变量

[root@server0 ~]# vim  /root/2.sh

#!/bin/bash

echo $1

echo $2

echo $3

echo ${10}         #显示超过两位数的值要加{}

echo ${11}

echo $21           #不加{}则显示前一位的值再加后一位的值

[root@server0 ~]# /root/2.sh haha  benniu  xixi  hehe   lele   dc  tc   dz   tz 100 200

haha

benniu

xixi

100                    #显示第十个值为100

200                    #显示第十个值为200

benniu1       #显示第二个值加个1为benniu1

[root@server0 ~]# vim /root/3.sh

#!/bin/bash

cat -n $1  |  head -$2             # $1表示要查看的文件内容加行号,$2表示前两行

[root@server0 ~]# /root/3.sh /etc/passwd   2

1 root:x:0:0:root:/root:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

预定义变量

用来保存脚本程序的执行信息

– 直接使用这些变量

– 不能直接为这些变量赋值

$#  已加载的位置变量的个数

$*  所有位置变量的值

$?  程序退出后的状态值,0表示正常,其他值异常

[root@server0 ~]# vim /root/2.sh

#!/bin/bash

echo $1

echo $2

echo $3

echo ${10}

echo ${11}

echo $#

echo $*

[root@server0 ~]# /root/2.sh  1  2 3 4 5 6 7 8 9 10 11

1

2

3

10

11

21

11                         #显示已加载的位置变量的个数为11

1 2 3 4 5 6 7 8 9 10 11     #显示所有位置变量的值

----------------------------------------------------------------------------------------

运算

[root@server0 ~]# expr 10 / 3

[root@server0 ~]# expr 10 \* 3     #单独*显示语法错误,前面加\表示乘号

[root@server0 ~]# expr 1 + 2

[root@server0 ~]# expr 3 - 1

[root@server0 ~]# expr 10  %  3    #取余数 运算

$() :将()里命令的输出结果,作为参数显示

[root@server0 opt]# date

[root@server0 opt]# date +%F    #只显示年月日

[root@server0 opt]# cd /opt

[root@server0 opt]# mkdir   $(date +%F)

[root@server0 opt]# ls

2017-11-07

[root@server0 opt]# mkdir   mydir-$(date +%F)

[root@server0 opt]# ls

2017-11-07  mydir-2017-11-07

[root@server0 opt]# mkdir   MariaDB-$(date +%F)

[root@server0 opt]# ls

2017-11-07  MariaDB-2017-11-07  mydir-2017-11-07

[root@server0 opt]# mkdir   $(hostname)-$(date +%F)

[root@server0 opt]# ls

2017-11-07  mydir-2017-11-07   MariaDB-2017-11-07  server0.example.com-2017-11-07

-------------------------------------------------------------------------------------------

常用的测试选项

检查文件状态

-e:文档存在为真

-d:文档存在且为目录为真

-f:文档存在且为文件为真

-r:文档存在且有读取权限为真

-w:文档存在且有写入权限为真

-x:文档存在且有执行权限为真

比较整数大小(带e都有等于二字,g代表大于,l代表小于)

-gt:大于

-ge:大于等于

-eq:等于

-ne:不等于

-lt:小于

-le:小于等于

字符串比对

== :相等

!=:不相等

----------------------------------------------------------------------------------------

if单分支语句

if [ 条件测试 ] ; then        #[]里一定要有空格

命令序列xx

else

命令序列yy

fi

[root@server0 /]# vim  /root/5.sh

#!/bin/bash

if  [ $1 -eq $2 ];then

echo hello

else

echo hi

fi

[root@server0 /]# /root/5.sh  1 1

hello

[root@server0 /]# /root/5.sh  1 2

hi

请书写一个脚本:

用户输入一个IP地址(read),判断是否可以与该IP地址通信,能通则输出 "IP ok"   否则 输出 "IP no"

[root@server0 /]# vim  /root/6.sh

#!/bin/bash

read  -p  '请输入一个IP地址:'  ip    #变量为ip

ping  -c  2  $ip  &> /dev/null

if [ $? -eq 0 ];then

echo  ${ip} ok

else

echo  ${ip} no

fi

[root@server0 /]#   /root/6.sh

请输入一个IP地址:127.0.0.1

127.0.0.1 ok

[root@server0 ~]# /root/6.sh

请输入一个IP地址:1.1.1.1

1.1.1.1 no

-----------------------------------------------------------------------------------------

if多分支语句

if [条件测试1] ; then

命令序列xx

elif [条件测试2] ; then

命令序列yy

else

命令序列zz

fi

成绩    大于等于90    优秀

大于等于80    良好

大于等于70    及格

大于等于60    仍需努力

60以下          在牛的肖邦,也弹不出哥忧伤

[root@server0 ~]# vim /root/8.sh

#!/bin/bash

read -p  '请输入您的成绩:'     num

if [ $num -gt  100 ];then        #大于100分

echo 成绩有误

elif [ $num -lt 0 ];then       #小于0分

echo 成绩有误

elif [ $num -ge 90 ];then

echo 优秀

elif [ $num -ge 80 ];then

echo 良好

elif [ $num -ge 70 ];then

echo 及格

elif [ $num -ge 60 ];then

echo 仍需努力

else

echo 在牛的肖邦,也弹不出哥忧伤

fi

-----------------------------------------------------------------------------------------

在 server0 上创建 /root/foo.sh 脚本

1)当运行/root/foo.sh redhat,输出为fedora

2)当运行/root/foo.sh fedora,输出为redhat

3)当没有任何参数或者参数不是 redhat 或者

fedora时,其错误输出产生以下信息:

/root/foo.sh  redhat|fedora

' ':把所有的特殊字符,当作普通文本字符输出

[root@server0 ~]# vim  /root/foo.sh

#!/bin/bash

if [  $1  ==  redhat  ];then

echo  fedora

elif [  $1  ==  fedora  ];then

echo  redhat

else

echo  '/root/foo.sh  redhat|fedora'

fi

[root@server0 ~]# /root/foo.sh redhat

[root@server0 ~]# /root/foo.sh fedora

[root@server0 ~]# /root/foo.sh haha

#!/bin/bash

if [ $# -eq 0 ];then      #表示脚本文件后位置变量的个数为0时,即没有任何参数(不输入参数)

echo '/root/foo.sh  redhat|fedora'

elif [ $1 == redhat ];then

echo fedora

elif [ $1 == fedora ];then

echo redhat

else

echo '/root/foo.sh  redhat|fedora'              #此输出为正确的,用echo$?验证为0

fi

" ":可以将 “没有” 变成 “ 空值”

#!/bin/bash

if [ "$1" == redhat ];then

echo fedora

elif [ "$1" == fedora ];then

echo redhat

else

echo '/root/foo.sh  redhat|fedora'  >&2   #将正确输出变成错误

exit 2                     #脚本退出返回值,即上一行命令为错时echo$?显示不为0的指定值2

fi

-------------------------------------------------------------------------------------------

for循环结构

循环结构:将反复执行的语句,循环去执行

for 变量名 in   值列表

do

命令序列

done

[root@server0 /]# vim  /root/for.sh

#!/bin/bash

for a in 1 2 3 4 5

do

useradd nsd$a

echo nsd$a创建成功

done

[root@server0 /]# vim  /root/for02.sh

#!/bin/bash

for a in 1 2 3 4 5

do

echo hello

done

-------------------------------------------------------------------------------------------

案例5:编写一个批量添加用户脚本

在 server0 上创建 /root/batchusers 脚本

1)此脚本要求提供用户名列表文件作为参数

2)如果没有提供参数,此脚本应该给出提示

Usage:/root/batchusers,退出并返回相应值

3)如果提供一个不存在的文件,此脚本应该给出提

示 Input file not found,退出并返回相应值

4)新用户的登录Shell为 /bin/false,无需设置密码

5)用户列表测试文件:

http://cla***oom/pub/materials/userlist

# wgethttp://cla***oom/pub/materials/userlist

[root@server0 /]# vim  /root/batchusers

#!/bin/bash

if [ $# -eq 0 ];then

echo 'Usage: /root/batchusers' >&2

exit 1

fi

if [ ! -e $1 ];then              # !表示不存在

echo 'Input file not found' >&2

exit 2

fi

for  a  in $(cat $1)

do

useradd -s /bin/false $a

echo $a创建成功

done

[root@server0 ~]# cat userlist

duanwu

zhongqiu

zhsan

lisi

[root@server0 ~]# /root/batchusers userlist    #可以自己创建别的用户

duanwu创建成功

zhongqiu创建成功

zhsan创建成功

lisi创建成功

-----------------------------------------------------------------------------------------

#!/bin/bash

if [ $# -eq 0 ];then

echo 'Usage: /root/batchusers' >&2

exit 1

fi

if [ -e $1 ];then

for  a  in $(cat $1)

do

useradd -s /bin/false $a

echo $a创建成功

done

else

echo 'Input file not found' >&2

exit 2

fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值