Linux--Shell 编程-bash,命令替换,if分支嵌套,运算,输入输出
SHELL 编程
shell 是一个命令解释器,侦听用户指令、启动这些指令、将结果返回给用户(交互式的shell)
shell 也是一种简单的程序设计语言、利用它可以编写一些系统脚本。
查看本机shell 信息:
cat /etc/shells --查看本支持的shell
echo $SHELL --查看当前支持的shell
shell 在执行命令时,各种命令的优先级:
别名 -> 关键字 -> 函数 -> 内置命令 -> 脚本
别名:命令的另一种形式,有些情况下可以简化命令的输入,例如可以将很长的命令定义成短别名。
别名的设置:
alias 别名= ' '
如: alias del='rm -i'
alias ll='ls -l'
alias 显示存在的别名
删除别名:unalias del
bash 初始化:
/etc/profile -> ~/.bash_profile -> /etc/profile.d/*.sh
-> ~/.bashrc -> /etc/bashrc
bash 退出时也会执行一些脚本
~/.bash_logout
bash 命令历史
默认情况下,shell 执行的命令会保留下来,保存的地方有两个:内存和~/.bash_history
保存下来后,可以查看,也可以上翻去执行。
执行的命令先放在内存中,退出窗口时写到 ~/.bash_history
历史查看:
history
cat ~/.bash_history
历史命令操作:
!! 执行前一个命令
!n 执行第n号命令,如 !1023
!$ 表示的是上一次命令的最后一个参数
如: mkdir /abc
cd !$
与history 相关的设置 (/etc/profile)
vim /etc/profile
HISTSIZE=1000 --内存中保存的最大记录条目
HISTFILESIZE=1000 --历史文件中保留的最大记录条目
HISTFILE --指定命令历史文件
禁用命令历史:
1) HISTSIZE 设置为0
2) 把历史命令文件链接到/dev/null
如: ln -s /dev/null ~/.bash_history
shell 中执行命令:
1、无条件执行多条命令
; 隔开
如:mkdir /abc ; cd /abc ;cp /etc/yp.conf /abc
2、有条件执行多条命令
&& 前一个命令执行成功后,再执行后一个(前面不成功,后面就不执行了)
|| 前一个命令执行不成功时,才执行后一个(前面成功了,后面就不执行了)
如:[tom@s100 ~]$ mkdir /aaa && cd /aaa && cp /etc/yp.conf /aa
[tom@s100 ~]$ mkdir /aaa || mkdir ~/aaa
3、子shell中执行
( ) 把命令括起来
例:(cd /etc/X11;ls)
4、命令替换 ` ` 或 $()
命令替换是将一个命令作为另一个命令的一部分,执行时被替换的部分先执行,执行的给果作为
参数传给外层命令
如: mkdir `echo $USER`
mkdir `date`
mkdir $(date)
返回值
每执行一个命令都有它的返回值,返回值用来标识命令的执行成功与否
查看上一个命令执行的返回值:echo $?
0 表示执行成功
shell 中的变量
shell 中的变量没有严格的类型之分,但不同数据还是有不同的运算符。
变量定义:
变量名=值
注:
1、变量名由字母、数字、下划线组成,不能以数字开头
2、变量区分大小写
3、shell 变量一般以大写命名(习惯,但不是要求)
如:a=3
获取变量值的方法:
$变量名
或者
${变量名} 尽可能用下面这个
如:
a=tt
echo "how are you" > $a_old.txt
echo "how are you" > ${a}_old.txt
shell 的变量运算
1、字符运算
字符连接
shell 的字符连接,无须任何符号,只需拼接起来即可
如:a=3;b=5;c=abcdefg
echo $a$b$c
字符处理
获取长度 ${#变量名}
例:a="abcdefg"
echo ${#a}
模式匹配 =~
如 if [[ $a =~ "^a" ]]
判断变量a是否以a开头
取子串 ${变量名:(+/-)n:n}
+n 从左边第n个位置开始取(第一个字符是0)
-n 从右边第n个位置开始取
n 取多少个
s="abcdefg"
echo ${s:(-3):1} --从倒数第3个开始,取1个
字符删除 ${变量名#*截止字符}
#*x 从左边开始删,遇到第一个x为止
##*x 从左边开始删,遇到最后一个x为止
%x* 从右边开始删除,遇到第一个x为止
%%d* 从右边开始删除,遇到最后一个x为止
str=/dir1/dir2/dir3/dir4/file.txt
echo {str#*d} --从左边开始,删到第一个d为止
ir1/dir2/dir3/dir4/file.txt
echo {str##*d} --从左边开始,删到最后一个d为止
ir4/file.txt
echo ${str%d*}
/dir1/dir2/dir3/
echo ${str%%d*}
/
basename 取完整路径中的文件名
basename /etc/sysconfig/network
network
basename $str
file.txt
2、算术运算
$[ ]
$(( ))
如:echo $[3*5]
echo $((3*8))
但要注意 shell 算数的能力比较差,小数处理有很多问题
如在程序需要计算小数,可用 bc 和 awk
如:
echo "scale=2;5/2" | bc
awk 'BEGIN {print 5/2}'
算术运算符:
+ - * / ** %
3、比较运算
数值比较
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
字符比较
= 等于
!= 不等于
\> 大于
\< 小于
-z string 字符是否为空
-n string 字符是否不为空
更多的内容可见 man test
输入输出:
输出: echo
格式:echo [option] 字符串
option:
-n 不换行
-e 对一些控制符加以处理
如 \t 插入tab
\a 发警告音
输入: read
格式:read [option] [var]
option:
-p 设置提示字符
-s 输入时不显示,如同输入密码
-t n 设置等待时间,如果过了指定的秒数,就返回一个非零的状态
-n n 设置只接收多个字符,达到这个字符个数n后,就自动回车
如:read -p “请输入你的姓名:" name
read -sp “请输入密码:" passwd
read -n 1 "是否继续:" jx
cut
语法:cut [option] [文件名]
option:
-b 取字节
-c 取字符
-f 取字段
-d 指定字段分隔符
范围表示:
N 第N项
N- 从第N项开始,到最后
N-M N-M 项
-M 从1到M
例:只显示 /etc/passwd 中的用户名信息
cut -d: -f1 /etc/passwd
shell 程序一般设计流程:
1、创建一个文件,把完成功能的每一步操作写到脚本文件中
2、设置文件的可执行权限
3、执行文件
例:写一程序从键盘读入两个数,输出最大数
[root@s100 script]# cat if1.sh
#!/bin/bash
#if 使用示例,显示两个数的最大数
read -p "请输入第一个数:" n1
read -p "请输入第二个数:" n2
max=$n1
if [ $n2 -gt $max ]
then
max=$n2
fi
echo "最大数是: $max"
流程控制:
分支结构
格式一:
if [ condition ] --注意括号两边有空格,condition 是个条件表达式
then
commands
fi
作用:判断 ccondition 条件是否成立,如果成立,执行中间的命令 commands
不成立不执行。
如: if [ $a -gt $b ]
then
echo "a大于b"
fi
if 可以接 条件表达式 如 if [ $a -gt $b ],也可以直接接一个命令
如 if mkdir /abc ,这时,会把命令的执行结果作为判断,如果成功执行
就相当于条件成立,如果执行不成功,就相当于条件不成立
格式二:
if [ condition ]
then
commands1
else
commands2
fi
作用:判断 condition 条件是否成立,如果成立,执行commands1,如果不成立
执行 commands2
如:if [ $a -gt $b ]
then
echo "a>b"
else
echo "b>=a"
fi
分支嵌套
分支嵌套是分支中包含分支
普通的分支形式:
if [ condition ]
then
commands
fi
或者
if [ condition ]
then
commands1
else
commands2
fi
嵌套后就:
if [ condition ]
then
if [ condition ]
then
commands1
else
commands2
fi
fi
if [ condition ]
then
if [ condition ]
then
commands1
else
commands2
fi
else
commands3
fi
如:
if [ $a -ge 0 ]
then
if [ $a -gt 0 ]
then
b=$a
else
b=0
fi
else
b=$[$a*-1]
fi
if [ ]
then
commands1
else
commands2
fi
例:输入文件,判断是否存在,如果存在,判断当前用户对它的权限
if [ -f $file ]
then
if [ -r ...
if [ -w ....
if [ -x ...
else
echo "文件不存在!"
exit 1
fi
用分支嵌套实现:
某产品 199 元一件,买5件或以上9折,10件或以上 85 折,输入购买件数,计算付款。
if [ $n -ge 5 ]
then
else
fi
多条件表示:
逻辑与
if [ condition1 -a condition2 ]
if [ condition1 ] && [ condition2 ]
if [[ condition1 && condition2 ]]
逻辑或
if [ condition1 -o condition2 ]
if [ condition1 ] || [ condition2 ]
if [[ condition1 || condition2 ]]
逻辑非(取反)
!
Linux--Shell 编程-bash,命令替换,if分支嵌套,运算,输入输出的更多相关文章
- shell编程:命令替换的运用
命令替换,有两种方式 方式一:`command` 方式二:$(command) user.sh 查找系统中所有的用户,并且输出 #!/bin/bash nginx=`netstat -tnlp | | ...
- linux shell编程-bash的奇技淫巧
本文主要讲bash脚本中容易出错和很少用但是用起来有意想不到效果的部分. 循环: 正常的for循环: for i in a b c 1 2 3; do echo "$i" done ...
- Linux Shell编程 sed命令
概述 sed 是一种几乎可以应用在所有 UNIX 平台(包括 Linux)上的轻量级流编辑器,体积小.所以,它可以对从如管道这样的标准输入中接收的数据进行编辑. sed 主要是用来将数据进行选取.替换 ...
- Linux Shell编程 awk命令
概述 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是l ...
- Linux Shell编程 test命令
概述 test 命令是Shell 脚本中用来进行条件判断的. test命令示例 按照文件类型进行判断 测试选项 作 用 -b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) -c ...
- Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||
https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...
- Linux Shell编程参考大全
本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...
- linux shell 编程参考
#!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...
- linux —— shell 编程(文本处理)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...
随机推荐
- matplotlib展现混淆矩阵
1.展现混淆矩阵 import matplotlib.pyplot as plt import itertools def plot_confusion_matrix(cm, classes, tit ...
- linux性能监控 + Sendmail 发邮件
sendmail安装 #!/bin/bash#控制发邮件的阈值是在rate,rate1和FF值(三个同样的用途,仅仅是名字不同)##注:该博文中的变量不规范,我是随意定义的,请注意##定义时间倒计时函 ...
- kafka Windows安装
1:安装JDK. 2:安装Zookeeper 下载地址:https://zookeeper.apache.org/releases.html 下载后,解压放在目录D:\bigdata(本文所用的目录) ...
- 能详细说一下action:=cafree这句吗?好多书都没说清楚!
关闭一个窗口有几种方式:最小化这个窗口,隐藏这个窗口,释放这个窗口,这句话就是说但这个窗口关闭的时候释放这个窗口,它应该是在form的onclose事件里面的 就是form.onclose() beg ...
- 利用Bag中的getCount()方法统计list集合中重复元素
实际应用场景:从Excel导入数据时,存在某个标识符相同的多条数据,需要进行合并,因此需要统计重复元素,可以利用Bag包下的getCount()进行统计,代码如下: package test.com. ...
- POI XSSF与HSSF区别
java操作Excel时报如下错误: The supplied data appears to be in the Office 2007+ XML. You are calling the part ...
- charles获取抓包数据
charles获取抓包数据 第一步:确保手机和电脑处于同一个局域网之下 第二步:进入 charles 的代理设定选项(主导航栏Proxy-----Proxy Setting......)中,允许代理, ...
- ES5与ES6常用语法教程之 ②解构语法糖、声明变量异同
js常用语法系列教程如下 es5与es6常用语法教程(1) es5与es6常用语法教程(2) es5与es6常用语法教程(3) es5与es6常用语法教程(4) es5与es6常用语法教程(5) es ...
- Java Applet基础——输出HelloWorld
前言: 我自己不专用applet,仅仅是了解一下,如果有不对的地方,还望大家多多帮助~谢谢! 一. 准备环境 1. 安装Java的编译环境(另行百度哦~) 2. 下载 applet.jar ,放在项目 ...
- Spring中用到了哪些设计模式?
谈谈Spring中都用到了哪些设计模式? JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见.我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是 ...