设为首页 收藏本站
查看: 847|回复: 0

Linux-shell脚本基础

[复制链接]

尚未签到

发表于 2018-8-20 10:01:05 | 显示全部楼层 |阅读模式
DSC0000.jpg

  本章内容
  编程基础
  脚本基本格式
  变量
  运算
  条件测试
  配置用户环境
  编程基础
  程序:指令+数据
  程序编程风格:
  过程式:以指令为中心,数据服务于指令
  对象式:以数据为中心,指令服务于数据
  shell程序:提供了编程能力,解释执行
  程序的执行方式
  计算机:运行二进制指令
  编程语言:
  低级:汇编
  高级:
  编译:高级语言-->编译器-->目标代码
  java,C#
  解释:高级语言-->解释器-->机器代码
  shell, perl, python
  编程基本概念
  编程逻辑处理方式:
  顺序执行
  循环执行
  选择执行
  shell编程:过程式、解释执行
  编程语言的基本结构:
  各种系统命令的组合
  数据存储:变量、数组
  表达式: a + b
  语句:if
  shell脚本基础
  shell脚本:
  包含一些命令或声明,并符合一定格式的文本文件
  格式要求:首行shebang机制
  #!/bin/bash
  #!/usr/bin/python
  #!/usr/bin/perl
  shell脚本的用途有:
  自动化常用命令
  执行系统管理和故障排除
  创建简单的应用程序
  处理文本或文件
  创建shell脚本
  第一步:使用文本编辑器来创建文本文件
  第一行必须包括shell声明序列:#!
  #!/bin/bash
  添加注释
  注释以#开头
  第二步:运行脚本
  给予执行权限,在命令行上指定脚本的绝对或相对路径
  直接运行解释器,将脚本作为解释器程序的参数运行
  脚本规范
  脚本代码开头约定
  1、第一行一般为调用使用的语言
  2、程序名,避免更改文件名为无法找到正确的文件
  3、版本号
  4、更改后的时间
  5、作者相关信息
  6、该程序的作用,及注意事项
  7、最后是各版本的更新简要说明
  脚本的基本结构
  脚本的基本结构
  #!SHEBANG
  CONFIGURATION_VARIABLES
  FUNCTION_DEFINITIONS
  MAIN_CODE
  shell脚本示例
  #!/bin/bash
  # ------------------------------------------
  # Filename: hello.sh
  # Revision: 1.1
  # Date: 2018/04/06
  # Author: qjy
  # Email: cs364281871@126.com
  # Website: www.178linux.com/user/761044264
  # Description: This is the first script
  # ------------------------------------------
  # Copyright: 2018 qjy
  # License: GPL
  echo “hello world”
  name="cat /etc/fstab"
  echo $name        显示成一行
  echo "$name"     显示成原来的格式
  脚本调试
  检测脚本中的语法错误
  bash -n /path/to/some_script
  调试执行
  bash -x /path/to/some_script
  变量
  变量:命名的内存空间
  数据存储方式:
  字符:
  数值:整型,浮点型
  变量:变量类型
  作用:
  1、数据存储格式
  2、参与的运算
  3、表示的数据范围
  类型:
  字符
  数值:整型、浮点型to/some_script
  强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误
  如 java,c#
  弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
  如:bash 不支持浮点数,php
  变量命名法则:
  1、不能使程序中的保留字:例如if, for
  2、只能使用数字、字母及下划线,且不能以数字开头
  3、见名知义
  4、统一命名规则:驼峰命名法
  bash中变量的种类
  根据变量的生效范围等标准划分下面变量类型:
  局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
  环境(全局)变量:生效范围为当前shell进程及其子进程
  本地变量:生效范围为当前shell进程中某代码片断,通常指函数
  位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
  特殊变量:$?, $0, $*, $@, $#,$$
  局部变量
  变量赋值:name=‘value’
  可以使用引用value:
  (1) 可以是直接字串; name=“root"
  (2) 变量引用:name="$USER"
  (3) 命令引用:name=`COMMAND` name=$(COMMAND)
  变量引用:${name} $name
  "":弱引用,其中的变量引用会被替换为变量值
  '':强引用,其中的变量引用不会被替换为变量值,而保持原字符串
  显示已定义的所有变量:set
  删除变量:unset name
  name1=mage
  name2=wang
  name3=$name1
  name1=zhangsir 变量1改变了,变量3会改变么?
  echo $name3=mage 变量3不会变
  练习
  1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
  echo "The host is `hostname`"
  echo "The ip is `ifconfig ens33 | grep netmask | tr -s " " | cut -d" " -f3`"
  echo "The system is `cat /etc/redhat-release`"
  echo "The kernel version is `uname -r` "
  echo "The CPU is `lscpu | grep "Model name:" | tr -s " " | cut -d: -f2`"
  echo "The memory is `cat /proc/meminfo | head -n1 | tr -s " " | cut -d " " -f2,3`"
  echo "The disk is `lsblk | grep disk | tr -s " " | cut -d" " -f4`"
  2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
  cp -a /etc/ /root/etc`date +%F`/
  3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
  userage="`df | grep /dev/sd | tr -s " " % | cut -d % -f5 | sort -nr | head -n1`"
  echo $userage
  4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
  who | egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c | sort -nr
  环境变量
  变量声明、赋值:
  export name=VALUE
  declare -x name=VALUE
  变量引用:$name, ${name}
  显示所有环境变量:
  env
  printenv
  export
  declare -x
  删除变量:
  unset name
  局部变量的工作范围为当前进程,无法传递给父进程和子进程,除非声明为环境变量,export name,父进程的环境变量可以传给子进程,但子进程的环境变量不能传给父进程
  pstree -p       显示进程树
  declare -x等价于export
  env 显示所有环境变量
  unset name  删除某变量
  bash内建的环境变量:
  PATH
  SHELL
  USER
  UID
  HOME
  PWD
  SHLVL
  LANG
  MAIL
  HOSTNAME
  HISTSIZE
  —
  什么时候加$?某命令能识别变量就不用加$,不能识别变量就要加$
  只读和位置变量
  只读变量:只能声明,但不能修改和删除
  声明只读变量:
  readonly name
  declare -r name
  查看只读变量:
  readonly –p
  位置变量:在脚本代码中调用通过命令行传递给脚本的参数
  $1, $2, ...:对应第1、第2等参数,shift [n]换位置
  $0: 命令本身
  $*: 传递给脚本的所有参数,全部参数合为一个字符串
  $@: 传递给脚本的所有参数,每个参数为独立字符串
  $#: 传递给脚本的参数的个数
  $@ $* 只在被双引号包起来的时候才会有差异
  set -- 清空所有位置变量
  $0:如果是软链接,比如link.sh -> arg.sh,$0将是软链接名,可实现不同的功能
  shift       移动$1,2,3...这些变量,默认向左移1位
  退出状态
  进程使用退出状态来报告成功或失败
  ·0 代表成功,1-255代表失败
  ·$? 变量保存最近的命令退出状态
  例如:
  ping -c1 -W1 hostdown &> /dev/null
  echo $?
  退出状态码
  bash自定义退出状态码
  exit [n]:自定义退出状态码
  注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
  注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
  算术运算
  bash中的算术运算:help let
  +, -, *, /, %取模(取余), **(乘方)
  实现算术运算:
  (1) let var=算术表达式
  (2) var=$[算术表达式]
  (3) var=$((算术表达式))
  (4) var=$(expr arg1 arg2 arg3 ...)
  (5) declare –i var = 数值
  (6) echo ‘算术表达式’ | bc
  乘法符号有些场景中需要转义,如*
  bash有内建的随机数生成器:$RANDOM(0-32767)
  echo $[$RANDOM%50] :0-49之间随机数
  赋值
  增强型赋值:
  +=, -=, *=, /=, %=
  let varOPERvalue
  例如:let count+=3
  自加3后自赋值
  自增,自减:
  let var+=1
  let var++
  let var-=1
  let var--
  练习
  1、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
  uid1="`cut -d: -f3 /etc/passwd | head -n10 | tail -n1`"
  uid2="`cut -d: -f3 /etc/passwd | head -n20 | tail -n1`"
  sumid=$[$uid1+$uid2]
  echo $sumid
  2、编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
  [ $# -ne 2 ] && echo "args should be 2" &&exit
  space1=`egrep "^[[:space:]]*$" $1 | wc -l`
  space2=`egrep "^[[:space:]]*$" $2 | wc -l`
  echo $[space1+space2]
  3、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
  countetc=`ls -a /etc/ | wc -l`
  countvar=`ls -a /var | wc -l`
  countusr=`ls -a /usr | wc -l`
  sum=$[countetc+countvar+countusr-6]       #-6是减去三个文件夹里的.和..目录
  echo $sum
  逻辑运算
  true, false
  1, 0
  与:
  1 与 1 = 1
  1 与 0 = 0
  0 与 1 = 0
  0 与 0 = 0
  或:
  1 或 1 = 1
  1 或 0 = 1
  0 或 1 = 1
  0 或 0 = 0
  非:!
  ! 1 = 0
  ! 0 = 1
  短路运算
  短路与
  第一个为0,结果必定为0
  第一个为1,第二个必须要参与运算
  短路或
  第一个为1,结果必定为1
  第一个为0,第二个必须要参与运算
  异或:^
  异或的两个值,相同为假,不同为真
  条件测试
  判断某需求是否满足,需要由测试机制来实现
  专用的测试表达式需要由测试命令辅助完成测试过程
  评估布尔声明,以便用在条件性执行中
  ·若真,则返回0
  ·若假,则返回1
  测试命令:
  ·test EXPRESSION
  ·[ EXPRESSION ]
  ·[[ EXPRESSION ]]
  注意:EXPRESSION前后必须有空白字符
  条件性的执行操作符
  根据退出状态而定,命令可以有条件地运行
  ·&& 代表条件性的AND THEN
  ·|| 代表条件性的OR ELSE
  例如:
  grep -q no_such_user /etc/passwd \
  || echo 'No such user'
  No such user
  ping -c1 -W2 station1 &> /dev/null \
  > && echo "station1 is up" \
  > || (echo 'station1 is unreachable'; exit 1)
  station1 is up
  test命令
  长格式的例子:
  test "$A" == "$B" && echo "Strings are equal"
  test “$A” -eq “$B” && echo "Integers are equal"
  简写格式的例子:
  [ "$A" == "$B" ] && echo "Strings are equal"
  [ "$A" -eq "$B" ] && echo "Integers are equal"
  bash的数值测试
  -v VAR
  变量VAR是否设置
  数值测试:
  -gt 是否大于
  -ge 是否大于等于
  -eq 是否等于
  -ne 是否不等于
  -lt 是否小于
  -le 是否小于等于
  bash的字符串测试
  字符串测试:
  == 是否等于
  > ascii码是否大于ascii码
  < 是否小于
  != 是否不等于
  =~ 左侧字符串是否能够被右侧的PATTERN所匹配
  注意: 此表达式一般用于[[ ]]中;扩展的正则表达式(不要加双引号,否则会被认为是字符串而不是正则表达式)
  -z &quot;STRING“ 字符串是否为空,空为真,不空为假
  -n &quot;STRING“ 字符串是否不空,不空为真,空为假
  注意:用于字符串比较时的用到的操作数都应该使用引号
  [[ $- == *i* ]]       双中括号里,==双等号可以匹配*等符号,类似于通配符,但匹配的是字符串
  练习
  1、编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
  [ $# -lt 1 ] && echo &quot;At lease 1 arg&quot; && exit
  egrep &quot;^[[:space:]]*$&quot; $1 | wc -l
  2、编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
  ping -c1 -W1 $1 &> /dev/null
  [ $? -eq 0 ] && echo &quot;host can be reached&quot; || echo &quot;host cannot be reached&quot;
  3、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
  userage=&quot;`df | grep /dev/sd | tr -s &quot; &quot; % | cut -d % -f5 | sort -nr | head -n1`&quot;
  [ &quot;$userage&quot; -ge &quot;80&quot; ] && wall disk will be full
  userage=&quot;`df -i | grep /dev/sd | tr -s &quot; &quot; % | cut -d % -f5 | sort -nr | head -n1`&quot;
  [ &quot;$userage&quot; -ge &quot;80&quot; ] && wall disk will be full
  Bash的文件测试
  存在性测试
  -a FILE:同-e
  -e FILE: 文件存在性测试,存在为真,否则为假
  存在性及类别测试
  -b FILE:是否存在且为块设备文件
  -c FILE:是否存在且为字符设备文件
  -d FILE:是否存在且为目录文件
  -f FILE:是否存在且为普通文件
  -h FILE 或 -L FILE:存在且为符号链接文件
  -p FILE:是否存在且为命名管道文件
  -S FILE:是否存在且为套接字文件
  Bash的文件权限测试
  文件权限测试:
  -r FILE:是否存在且可读
  -w FILE: 是否存在且可写
  -x FILE: 是否存在且可执行
  文件特殊权限测试:
  -u FILE:是否存在且拥有suid权限
  -g FILE:是否存在且拥有sgid权限
  -k FILE:是否存在且拥有sticky权限
  Bash的文件属性测试
  文件大小测试:
  -s FILE: 是否存在且非空
  文件是否打开:
  -t fd: fd 文件描述符是否在某终端已经打开
  -N FILE:文件自从上一次被读取之后是否被修改过
  -O FILE:当前有效用户是否为文件属主
  -G FILE:当前有效用户是否为文件属组
  双目测试:
  FILE1 -ef FILE2: FILE1是否是FILE2的硬链接
  FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
  FILE1 -ot FILE2: FILE1是否旧于FILE2
  Bash的组合测试条件
  第一种方式:
  COMMAND1 && COMMAND2 并且
  COMMAND1 || COMMAND2 或者
  ! COMMAND 非
  如:[[ -r FILE ]] && [[ -w FILE ]]
  第二种方式:
  EXPRESSION1 -a EXPRESSION2 并且
  EXPRESSION1 -o EXPRESSION2 或者
  ! EXPRESSION
  必须使用测试命令进行
  示例:
  [ -z “$HOSTNAME” -o $HOSTNAME &quot;==\
  &quot;localhost.localdomain&quot; ] && hostname www.magedu.com
  [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
  练习
  1、编写脚本/bin/per.sh,判断当前用户对指定参数文件,是否不可读并且不可写
  [ $# -ne 1 ] && echo &quot;1 args&quot; && exit
  [ -r $1 ] || [ -w $1 ] || { echo &quot;cannot be read or written&quot;;exit; }
  echo &quot;can be read or written&quot;
  2、编写脚本/root/bin/excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
  [ $# -ne 1 ] && echo &quot;1 arg&quot; && exit
  [ -e $1 ] || { echo &quot;file is not existed&quot;;exit; }
  [[ $1 =~ ^.+\.sh$ ]] && chmod +x $1 || echo &quot;not a shell script&quot;
  3、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和允许普通用户登录系统
  login.sh
  [ -e /etc/nologin ] || { echo &quot;allow login success&quot;;exit; }
  rm -rf /etc/nologin
  echo &quot;allow login success&quot;
  nologin.sh
  [ -e /etc/nologin ] && echo &quot;forbid login success&quot; && exit
  touch /etc/nologin
  echo &quot;forbid login success&quot;
  使用read命令来接受输入
  使用read来把输入值分配给一个或多个shell变量
  -p 指定要显示的提示
  -s 静默输入,一般用于密码
  -n N 指定输入的字符长度N
  -d ‘字符’ 输入结束符
  -t N TIMEOUT为N秒
  read 从标准输入中读取值,给每个单词分配一个变量
  所有剩余单词都被分配给最后一个变量
  read -p “Enter a filename: “ FILE
  ()小括号用法:
  小括号里的命令,改变环境是一次性的,如(umask 666;touch /data/f1)
  因为加小括号是开了个子shell
  可以man bash然后搜索()看一下
  {}大括号不开启子shell,但跟小括号一样是把命令当成一个整体
  { name=qjy;echo $qjy }
  [root@centos7 data]#x=1;echo &quot;pid=$$&quot;;(echo &quot;subpid=$$&quot;;echo &quot;subx=$x&quot;;x=2;echo &quot;subx2=$x&quot;);echo x=$x
  pid=33937
  subpid=33937
  subx=1
  subx2=2
  x=1
  结论:小括号的pid不变,局部变量可继承,执行完后不影响环境
  不像单开子SHELL,pid不一样,局部变量也不会继承
  $0:如果是软链接,比如link.sh -> arg.sh,$0将是软链接名,可实现不同的功能
  shift       移动$1,2,3...这些变量,默认向左移1位
  数字运算:
  help let
  输出不同颜色的color字符
  [root@centos7 bin]#COLOR=$[RANDOM%7+31];echo -e &quot;\e[1;${COLOR}mcolor\e[0m&quot;
  与
  或
  非
  短路与 &&
  短路或 ||
  0&&0=0
  0&&1=0
  1&&0=0
  1&&1=1
  cmd1 && cmd2
  如果cmd1为假,cmd2不需要执行,反之cmd1为真,需要cmd2执行
  0||0=0
  0||1=1
  1||0=1
  1||1=1
  cmd1 || cmd2
  如果cmd1为真,cmd2不需要执行,反之cmd1为假,需要cmd2执行
  XOR 异或
  0^1=1
  0^0=0
  1^0=1
  1^1=0
  同极相斥,异极相吸
  a、b互换
  [root@centos7 bin]#a=4
  [root@centos7 bin]#b=6
  [root@centos7 bin]#a=$[a^b];b=$[a^b];a=$[a^b]
  [root@centos7 bin]#echo $a $b
  6 4
  declare -i x   声明x为数值
  [root@centos7 bin]#declare -i x=10
  [root@centos7 bin]#declare -i y=20
  [root@centos7 bin]#declare -i z=x+y
  [root@centos7 bin]#echo $z
  30
  [ &quot;$a&quot; = &quot;$b&quot; ]      变量建议加上双引号,避免因为变量值为空时,等号前没有值,出现语法错误
  [root@centos7 bin]#[ -w /etc/shadow ] && echo true || echo false
  true
  [root@centos7 bin]#[ -x /etc/shadow ] && echo true || echo false
  false
  在脚本中如果要实现false || { echo cmd1 ; exit },要用大括号,否则用小括号的话,exit只退出小括号,不退出脚本
  鸡兔同笼问题
  分别read头数和腿数,输出鸡和兔的的只数
  read -p &quot;head number: &quot; head
  [[ &quot;$head&quot; =~ [0-9]+$ ]] || { echo head is not a number; exit ;  }
  read -p &quot;feet number: &quot; feet
  [[ &quot;$feet&quot; =~ [0-9]+$ ]] || { echo feet is not a number; exit ;  }
  rabbit=$[(feet-head*2)/2]
  chook=$[head-rabbit]
  ( [ &quot;$chook&quot; -lt 0 ] | [ &quot;$rabbit&quot; -lt 0 ] ) && echo &quot;wrong head or feet numbe
  r&quot; && exit
  echo &quot;chook is $chook&quot;
  echo &quot;rabbit is $rabbit&quot;
  思考
  1 手机号
  [[ $1 =~ ^1[0-9]{10}$ ]] && echo &quot;right&quot; || echo &quot;wrong&quot;
  2 邮箱
  [[ $1 =~ ^.+@[[:alnum:]\.]+\.[[:alnum:]]{,6}$ ]] && echo &quot;right&quot; || echo &quot;wrong&quot;
  3 QQ号
  [[ $1 =~ ^[1-9][0-9]{4,9}$ ]]
  bash如何展开命令行
  把命令行分成单个命令词
  展开别名
  展开大括号的声明({})
  展开波浪符声明(~)
  命令替换$() 和 ``)
  再次把命令行分成命令词
  展开文件通配(*、?、[abc]等等)
  准备I/0重导向()
  运行命令
  防止扩展
  反斜线(\)会使随后的字符按原意解释
  $ echo Your cost: \$5.00
  Your cost: $5.00
  加引号来防止扩展
  ·单引号(')防止所有扩展
  ·双引号(”)也防止所有扩展,但是以下情况例外:
  $(美元符号) - 变量扩展
  `(反引号) - 命令替换
  \(反斜线) - 禁止单个字符扩展
  !(叹号) - 历史命令替换
  批量赋值
  read x y z  ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
  非交互式登录:
  (1)su UserName
  (2)图形界面下打开的终端
  (3)执行脚本
  (4)任何其它的bash实例
  执行顺序: ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
  执行顺序可以看配置文件里的具体内容,发现这几个配置文件是顺序调用的
  从执行顺序来看,执行脚本不支持别名alias
  Profile
  按功能划分,存在两类:
  profile类和bashrc类
  profile类:为交互式登录的shell提供配置
  全局:/etc/profile, /etc/profile.d/*.sh
  个人:~/.bash_profile
  功用:
  (1) 用于定义环境变量
  (2) 运行命令或脚本
  Bashrc
  bashrc类:为非交互式和交互式登录的shell提供配置
  全局:/etc/bashrc
  个人:~/.bashrc
  功用:
  (1) 定义命令别名和函数
  (2) 定义本地变量
  编辑配置文件生效
  修改profile和bashrc文件后需生效
  两种方法:
  1重新启动shell进程
  2 . 或source
  例:
  . ~/.bashrc
  Bash 退出任务
  保存在~/.bash_logout文件中(用户)
  在退出登录shell时运行
  用于
  ·创建自动备份
  ·清除临时文件
  $-变量
  h:hashall,打开这个选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭
  i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的。
  m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等。
  B:braceexpand,大括号扩展
  H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令
  source或.表示在本shell中运行,一般的脚本运行方法是在子进程/子shell中运行
  练习
  1、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
  答:vim /etc/profile.d/env.sh
  然后新加一行 PATH=/usr/local/apache/bin:$PATH
  :wq退出后,source /etc/profile.d/env.sh使配置生效
  2、用户root登录时,将命令指示符变成红色,并自动启用如下别名:rm='rm -i'
  cdnet='cd /etc/sysconfig/network-scripts/'
  editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'
  editnet='vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33' (如果系统是CentOS7)
  答:
  (1) vim /root/.bash_profile,添加一行:PS1=&quot;\[\e[1;31m\][\u@\h \W]\\$\[\e[0m\]&quot;,然后:wq
  (2) vim /root/.bashrc,如果是CentOS6,添加这两行
  cdnet='cd /etc/sysconfig/network-scripts/'
  editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'
  如果是CentOS7,添加这两行
  cdnet='cd /etc/sysconfig/network-scripts/'
  editnet='vim /etc/sysconfig/network-scripts/ ifcfg-ens33'
  (3) source /root/.bash_profile /root/.bashrc
  3、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
  答:m /etc/motd,输入一行^[[1;31mHi,dangerous!^[[0m,其中^[是在vim中Ctrl+v+[敲出来的,然后:wq保存退出
  4、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
  vim /root/.vimrc输入以下内容
  set ignorecase
  set cursorline
  set autoindent
  autocmd BufNewFile *.sh exec &quot;:call SetTitle()&quot;
  func SetTitle()
  if expand(&quot;%:e&quot;) == 'sh'
  call setline(1,&quot;#!/bin/bash&quot;)
  call setline(2,&quot;#&quot;)
  call setline(3,&quot;#********************************************************************&quot;)
  call setline(4,&quot;#Author:                ###&quot;)
  call setline(5,&quot;#QQ:                    ##########&quot;)
  call setline(6,&quot;#Date:                  &quot;.strftime(&quot;%Y-%m-%d&quot;))
  call setline(7,&quot;#FileName:             &quot;.expand(&quot;%&quot;))
  call setline(8,&quot;#URL:                   http://###############&quot;)
  call setline(9,&quot;#Description:          The test script&quot;)
  call setline(10,&quot;#Copyright (C):        &quot;.strftime(&quot;%Y&quot;).&quot; All rights reserved&quot;)
  call setline(11,&quot;#********************************************************************&quot;)
  call setline(12,&quot;&quot;)
  endif
  endfunc
  autocmd BufNewFile * normal G
  5、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等
  vim设置见第4题。其他的配置,vim /etc/profile.d/reset.sh新建一个reset.sh文件,输入以下信息:
  PS1=&quot;\[\e[1;36m\][\u@\h \W]\\$\[\e[0m\]&quot;
  HISTTIMEFORMAT=&quot;%F %T &quot;
  HISTCONTROL=ignoreboth


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-554137-1-1.html 上篇帖子: Linux shell 编程(七):流程控制语句 下篇帖子: Shell编程规范与变量基础知识(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表