if 语句 基础学习笔记 (一)

如何设定变量,引用

[[email protected] ~]# ANIMAL=pig      #定义变量值
[[email protected] ~]# echo "There are some $ANIMALs."    # {}也可以引用变量
There are some .
[[email protected] ~]# echo "There are some ${ANIMAL}s."  # 双引号弱引用,替换变量
There are some pigs.
[[email protected] ~]# echo ‘There are some ${ANIMAL}s.‘  # 单引号强引用,不做变量替换
There are some ${ANIMAL}s.

脚本在执行时会启动一个子shell进程

命令行中启动的脚本会继承当前shell环境变量

系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量

如何设定本地变量,环境变量

本地变量:

VARNAME=VALUE   作用域为整个bash进程

局部变量:

local VARNAME=VALUE   作用域为当前代码段

环境变量:

export VARNAME=VALUE  作用域为当前shell进程及其子进程

VARNAME=VALUE

export VARNAME

位置变量: $1,$2....., shift

特殊变量: $? : 上一个命令的执行状态返回值

程序执行,可能有两类返回值

程序执行结果

程序状态返回代码 ( 0-255 )

0 : 正确执行

1-255 : 错误执行   1 , 2 , 127 系统预留

撤销变量: unset VARNAME

[[email protected] ~]# name=zhao     #定义变量 name=zhao
[[email protected] ~]# echo $name
zhao
[[email protected] ~]# unset name    #取消变量
[[email protected] ~]# echo $name    #取消成功

查看当前shell中的变量 ( 包括本地变量和环境变量 )

[[email protected] ~]# set

查看当前shell中的环境变量

[[email protected] ~]# printenv
[[email protected] ~]# env
[[email protected] ~]# export

给变量添加变量值

[[email protected] ~]# echo $ANIMAL
pig
[[email protected] ~]# ANIMAL=$ANIMAL:goat   #在变量 ANIMAL 基础上添加变量
[[email protected] ~]# echo $ANIMAL
pig:goat

/dev/null : 软件设备, bit bucket  数据黑洞

[[email protected] ~]# id root &> /dev/null
[[email protected] ~]# echo $?
0

练习: 写一个脚本,完成以下任务

1 . 添加5个用户,user1,...,user5

2 . 每个用户的密码同用户名,而且要求,添加密码完成后不显示命令passwd的执行结果信息

3 . 每个用户添加完成后,都要显示用户某某已经成功添加

#!/bin/bash
useradd user1
echo "user1" | passwd --stdin user1 &> /dev/null
echo "add user1 successfully."

练习: 写一个脚本,完成以下任务

1 . 使用一个变量保存一个用户名

2 . 删除此变量中的用户,且一并删除其家目录

3 . 显示"用户删除完成"类的信息

#!/bin/bash
zhao=user2
useradd ${zhao}
#echo "useradd $zhao 0k"
userdel -r ${zhao}
echo "userdel finish."

变量名称:

1 . 只能包含字母,数字和下划线,并且不能数字开头

2 . 不应该跟系统中已有的环境变量重名

3 . 最好做到见名知义

bash中如何实现条件判断

条件测试类型

整数测试

字符测试

文件测试

条件测试的表达式

[ expression ]

[[ expression ]]

test expression

整数比较

-eq : 测试两个整数是否相等.比如 $A -eq $B

-ne : 测试两个整数是否不等.不等为真,等于为假

-gt : 测试一个数是否大于另一个数.大于为真,否则为假

-lt : 测试一个数是否小于另一个数.小于为真,否则为假

-ge : 大于或等于

-le : 小于或等于

命令间的逻辑关系

逻辑与 : && 全部为真才为真

第一个条件为假时,第二条件不用再判断,最终结果为假

第一个条件为真时,第二条件必须得判断,若第二个条件为真才为真,第二个条件为假就为假

逻辑或 : ||  一个为真则为真

第一个条件为假时,判断第二个条件,第二个条件若为真则为真,为假则为假

第一个条件为真时,第二个条件不在判断,最终结果为真

练习 : 如果用户user6不存在,就添加用户user6

 ! id user6 && useradd user6   # ! 为结果取反. ! id user6 意思是如果用户不存在 &&(逻辑与) 则判断下一条命令
 id user6 || useradd user6 #如果 user6 存在(判断条件为真) ||(逻辑或) 则不在运行下一条命令

练习 : 判断 /etc/inittab 文件中有多少行,若大于100行则显示为 big file 否则显示 small file

#!/bin/bash
LINES=`wc -l /etc/inittab`  # `wc -l /etc/inittab`   命令引用
#echo $LINES
FINLINES=`echo $LINES | cut -d‘ ‘ -f1`
#echo $FINLINES
[ $FINLINES -gt 100 ] && echo "/etc/inittab is a big file." || echo "/etc/inittab is a small file."

练习 : 如果用户存在,就显示用户已存在;否则,就添加此用户

id user1 && echo "user1 exists." || useradd user1

练习 : 如果用户不存在,就添加.否则,显示其已经存在

! id user1 && useradd user1 || echo "user1 exists."

练习 :  如果用户不存在,就添加用户并且给密码;否则,显示其已经存在

! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exists."

练习 : 写一个脚本,完成以下要求

1. 添加 3 个用户 user1 , user2 , user3; 但要要求判断用户是否存在,不存在而后再添加

2. 最后显示当前系统上共有多少个用户

! id user1 &> /dev/null && useradd user1 && echo "user1" | passwd --stdin user1 &> /dev/null || echo "user1 exists."

! id user2 &> /dev/null && useradd user2 && echo "user1" | passwd --stdin user2 &> /dev/null || echo "user2 exists."

! id user3 &> /dev/null && useradd user3 && echo "user1" | passwd --stdin user3 &> /dev/null || echo "user3 exists."

USERS=`wc -l /etc/passwd | cut -d: -f1`

echo "$USERS users."

练习:写一个脚本,完成以下要求

给定一个用户 :  1 . 如果其 UID 为 0 , 就显示为此管理员   2 . 否则,就显示其为普通用户

#/bin/bash
NAME=user1
USERID=`id -u $NAME`    # id -u 判断 UID
[ $USERID -eq 0 ] && echo "Admin" || echo "Common user."

使用 if 语句完成   (单分支 if 语句)

#!/bin/bash
NAME=user1
USERID=`id -u $NAME`
if [ $USERID -eq 0 ]; then
   echo "Admin."
else
   echo "Common user."
fi

条件判断,终止结构

单分支 if 语句

if 判断条件; then

statement1

statement2

....

fi

例: (单分支语句)   判断 user1 用户是否存在,如果存在则显示用户已存在

#!/bin/bash

NAME=user1

if id $NAME &> /dev/null; then

echo "$NAME exists."

fi

双分支的 if 语句

if 判断条件; then

statement1

statement2

...

else

statement3

statement4

...

fi

例: (双分支语句)  如果用户 user1 存在,则显示用户已存在,否则显示用户不存在

#!/bin/bash
NAME=user1
if id $NAME &> /dev/null; then
   echo "$NAME exists."
else
   echo "$NAME not exists."
fi

例: (双分支语句)  如果用户 user1 存在,则显示用户已存在,否则添加用户 user1

#!/bin/bash
NAME=user1
if id $NAME &> /dev/null; then
   echo "$NAME exists."
else
   useradd $NAME
   echo "$NAME" | passwd --stdin $NAME &> /dev/null
   echo "Add $NAME finished."
fi

多分支的 if 语句

if 判断条件1; then

statment1

....

elif 判断条件2; then

satment2

...

elif 判断条件3; then

statment3

...

else

statment4

...

fi

测试脚本是否有语法错误:

bash -n 脚本名称

bash -x 脚本名称; 单步执行

定义脚本退出状态码

exit: 退出脚本

exit: #

文件测试 :

-e FILE : 测试文件是否存在

-f FILE : 测试文件是否为普通文件

-d FILE : 测试指定路径是否为目录

-r  FILE : 测试当前用户对指定文件是否有读权限

-w FILE : .... 写权限

-x FILE : .....执行权限

练习 : (多分支 if 语句)

给定一个文件:  如果是一个普通文件,就显示之.  如果是一个目录,就显示之.   否则,此为无法识别之文件

#!/bin/bash
FILE=/etc/inittab
if [ ! -e $FILE ]; then    #如果文件不存在
  echo "No such file"
  exit 9
fi
if [ -e $FILE ]; then
   echo "Common file."
elif
   [ -d $FILE ]; then
   echo "Directory."
else
   echo "Unknow."
fi

练习: 判断当前系统上是否有用户的默认shell为bash; 如果有,就显示有多少个这类用户;否则,就显示没有这类用户;

#!/bin/bash
grep "\<bash$" /etc/passwd &> /dev/null    #找到以 bash 为单词结尾的行,输出命令不要
RETVAL=$?
if [ $RETVAL -eq 0 ]; then         
 USERS=`grep "\<bash$" /etc/passwd | wc -l`
 echo "The shells of $USERS users is bash."
else
   echo "not such user."
fi

练习 : 判断当前系统上是否有用户的默认shell为bash;如果有,就显示用户名;否则,就显示没有这类用户;

#!/bin/bash
grep "\<bash$" /etc/passwd &> /dev/null
REVAEL=$?
if [ $REVAEL -eq 0 ]; then
  USERNAME=`grep "\<bash$" /etc/passwd | cut -d: -f1`
  echo "$USERNAME"
else
  echo "not user."
fi

练习 : 给定一个用户,判断其用户UID于GID是否一样.如果一样,就显示为"good guy";否则,就显示此用户为"bad guy"

写法一

#!/bin/bash        
USER=user1
USERUID=`id -u $USER`
USERGID=`id -g $USER`
if [ $USERUID -eq $USERGID ]; then
   echo "good guy."
else
   echo "bad guy."
fi

写法二

#!/bin/bash
USERNAME=user1
if ! grep "^$USERNAME" /etc/passwd &> /dev/null; then
   echo "No such user: $USERNAME."
   exit 8       #首先需要判断 user1 是否存在,如果不存在则退出
fi
USERUID=`grep "^$USERNAME" /etc/passwd | cut -d: -f3`
USERGID=`grep "^$USERNAME" /etc/passwd | cut -d: -f4`
if [ $USERUID -eq $USERGID ]; then
   echo "Good guy"
else
   echo "Bad guy"
fi

练习 : 查找 /etc/inittab 下有没有空白行,如果有是多少行

#!/bin/bash
FILE=/etc/inittab
if [ ! -e $FILE ]; then   #首先判断 /etc/iniitab 是否存在
   echo "No such file."
   exit 8
fi
if grep "^$" /etc/inittab &> /dev/null; then
   echo "Total blank lines:`grep "^$" $FILE | wc -l`."
else
   echo "No blank line."
fi

shell 中如何进行算术运算

A=3   B=6

1 . let 算术运算表达式

let C=$A+$B

2 . $[算术运算表达式]

C=$[$A+$B]

3 . $((算术运算表达式))

C=$(($A+$B))

4 . expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用

C=`expr $A + $B `

练习 : 给定一个用户,获取其密码警告期限,而后判断用户密码使用期限是否已经小于警告期限

如果小于,则显示"Warning" 否则显示"OK"

#!/bin/bash
W=`grep "student" /etc/passwd | cut -d: -f6`   #首先获取 students 的密码警告期限
S=`date +%s`     #获取绝对秒数
T=`expr $S/86400`   #绝对秒数除以每天的秒数86400,计算现在的时间
L=`grep "student" /etc/shadow | cut -d: -f5` # f5为多少天内必须密码
N=`grep "student" /etc/shadow | cut -d: -f3` # f3为上次修改密码的日期
SY=$[$L-$[$T-$N]]
if [ $SY -lt $W ]; then
   echo "Worning."
else
   echo "OK."
fi

位置变量 : # ./filetest.sh /etc/fstab /etc/inittab

$1 : /etc/fstab

$2 : /etc/inittab

练习 : 写一个脚本  (位置变量)

能接受一个参数(文件路径)    判定 : 此参数如果是一个存在的文件,就显示"OK.",否则就显示"No such file."

#!/bin/bash
if [ -e $1 ]; then
   echo "OK."
else
   echo "No such file."
fi

[[email protected] ~]# ./file3.sh /etc/inittab   #文件存在

OK.

[[email protected] ~]# ./file3.sh /etc/inittabbb   #文件不存在

No such file.

特殊变量:

$?    退出状态码

$#    参数的个数

$*     参数列表

[email protected]   参数列表

练习 : 写一个脚本 (位置变量)    能接受一个参数 (文件路径)

判定 : 此参数如果是一个存在的文件,就显示"OK.",否则就显示"No such file." 
          如果没有跟参数,则提示用户追加参数
#!/bin/bash
if [ $# -lt 1 ]; then      # $#为参数的个数,若参数的个数小于1,则提示用户.下面程序不再进行
   echo "Usage: ./file3.sh ARG1 [ARG2...]"
   exit 4
fi
if [ -e $1 ]; then
   echo "OK."
else
   echo "No such file."
fi

[[email protected] ~]# ./file3.sh

Usage: ./file3.sh ARG1 [ARG2...]

位置变量 shift 的使用

#!/bin/bash

echo "$1"

shift

echo "$1"

shift

echo "$1"

shift

[[email protected] ~]# ./shift.sh 1 2 3

1

2

shift 替换使用

#!/bin/bash

echo "$1"

shift 2

echo "$1"

shift 2

echo "$1"

[[email protected] ~]# ./shift.sh 1 2 3 4 5

1

3

5

练习 : 写一个脚本   给脚本传递两个参数(整数);  显示此两者之和,之积

#!/bin/bash
if [ $# -lt 2 ]; then
  echo "Usage: he.sh ARG1 ARG2."
  exit 8
fi
echo "The sum is : $(($1+$2))."
echo "The prod is : $(($1*$2))."

字符测试

== : 测试是否相等 , 相等为真 , 不等为假

!= : 测试是否不等 , 不等为真 , 相等为假

-n string : 测试指定字符串是否为空 , 空则真 , 不空则假

-z string : 测试指定字符串是否不空 , 不空为真 , 空为假

练习 : 传递一个用户名参数给脚本,判断此用户的用户名跟基本组的组名是否一致,并将结果显示出来

#!/bin/bash
if [ $# -lt 1 ]; then   #如果用户没有输入: 用户名 则退出
  echo "NO user."
  exit 4
fi
if ! id $1 &> /dev/null; then   #如果用户输入的用户名不存在,则显示 : No such user
   echo "No such user."
   exit 9
fi
if [ `id -n -u $1` == `id -n -g $1` ]; then      # id -n -u 用户名  id -n -g 基本组组名
  echo "Yiyang."
else
  echo "Bu Yiyang."
fi

[[email protected] ~]# groupadd hello

[[email protected] ~]# useradd -g hello hi   #添加用户测试

[[email protected] ~]# ./usertest.sh hi

Bu Yiyang.

练习 : (字符测试) 传递一个参数(单字符就行)给脚本,如参数为q,Q,quit,Quit就退出脚本; 否则,就显示用户的参数

#!/bin/bash
if [ $# -lt 1 ]; then
   echo "No such user"
   exit 4
fi
if [ $1 == q ]; then
  echo "Bye."
  exit 1
elif
   [ $1 == Q ]; then
  echo "Bye Bye."
  exit 2
elif
  [ $1 == quit ]; then
  echo "Bye Bye Bye."
  exit 3
elif
  [ $1 == Quit ]; then
  echo "Bye Bye Bye Bye."
  exit 4
else
  echo $1
fi
时间: 2024-08-05 04:32:24

if 语句 基础学习笔记 (一)的相关文章

Oracle PL/SQL语句基础学习笔记(上)

PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE server和其它工具中了,近几年中很多其它的开发者和DBA開始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件.以及怎样设计并运行一个PL/SQL程序. 1.PL/SQL的长处 从版本号6開始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的长处以及其独有的数据管理的便利性,那么你非常难想象ORACLE缺了PL/SQL的情形.PL/SQL 不是一个独立的产品,他

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分

java基础学习笔记day01

java基础学习笔记day01 1.软件开发: 软件:按照特定顺序组织的计算机数据和指令的集合 开发:软件的制作过程 软件开发:借助开发工具和计算机语言制作软件 2.java概述: java之父:詹姆斯·高斯林 JDK:java开发环境 jre:java运行环境 JVM:java虚拟机 java跨平台是因为,JVM能在不同的平台运行,JVM是跨平台的 JavaSE:标准版 JavaME:手机端,物联网 JavaEE:企业版,互联网项目 3.java语言特点: 简单性 解释性 面向对象 高性能 分

js基础学习笔记(一)

* 在js编写过程中,尽量保持统一使用单引号 'XXXX': * 所有变量都要声明 var,避免全局函数调用的冲突: 1.1    输出内容 docment.write(‘aileLi’); 改变某ID元素样式 docment.getElementById(‘ID’).style.color=’样式参数’; 1.2   输出弹出框 alert(‘aileLi’); 1.5  什么是变量?  从字面上看,变量是可变的量: 从编程角度讲,变量是用于存储某种/某些数值的存储器. 定义变量使用关键字va

基础学习笔记之opencv(6):实现将图片生成视频

基础学习笔记之opencv(6):实现将图片生成视频 在做实验的过程中.难免会读视频中的图片用来处理,相反将处理好的图片又整理输出为一个视频文件也是非经常常使用的. 以下就来讲讲基于opencv的C++版本号中图片输出视频是怎么实现的. 本次试验的数据为摇摆的树枝树叶图片,Waving Trees,其来源网址为: http://research.microsoft.com/en-us/um/people/jckrumm/WallFlower/TestImages.ht 该数据全由bmp图片组成.

C语言基础学习笔记

--C语言框架-- 数据  字节byte          字符   char         8  半字half word     短整型        short int    16    字word            整型   int(integer)   32               长整型   long int     32                 单精度   float        32   双字(double word) 双精度  double       64 

linux应用编程基础学习笔记

********************************************************            --文件I/O-- 文件:文本文件:存储量大,速度慢,便于字符操作二进制文件:存储量小,速度快,便于存放中间结果 普通文件:设备文件: ---C标准函数---:Buffered I/O,高级文件系统,在用户空间开辟缓冲区,流操作(stream)#include<stdio.h> typedef struct{ int _fd;      //文件号 int _

MYSQL数据库基础学习笔记

一.mysql的安装与初始化: 安装mysql命令: yum install -y mysql-server mysql mysql-devel 初始化: service mysqld start   //第一次启动mysqld服务会自动初始化: 创建用户并初始化密码: mysqladmin -u root passwd '密码' 登陆mysql: mysql -u root -p 退出mysql: quit.exit 设置mysqld服务自启动: chkconfig mysqld on mys