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 ...
随机推荐
- react判断点击位置是否为组件内,实现点击外部触发组件内事件
1.导入 import {findDOMNode} from 'react-dom' 2.绑定ref <div ref="refTest" </div> 3.绑定 ...
- 利用Calendar类判断是平年还是闰年
package com.bgs.Math; import java.util.Calendar; import java.util.Scanner; /*###14.21_常见对象(如何获取任意年份是 ...
- lab 颜色模式的生理原因 黄色, 洋红色 刺眼。 绿色,蓝色,不刺眼。
hsb 颜色模式理解了. lab 颜色模式,都说是生理原因.没说是啥生理原因. 猜测:黄色, 洋红色 刺眼. 绿色,蓝色,不刺眼. https://blog.csdn.net/self_mind/ ...
- nhibernate Stuty
https://blog.csdn.net/u010371458/article/details/8995166 翻译版 https://wenku.baidu.com/view/46fa56cea1 ...
- 开发单体web shop] 6. 商品分类和轮播广告展示
目录 商品分类&轮播广告 商品分类|ProductCategory 需求分析 开发梳理 编码实现 轮播广告|SlideAD 需求分析 开发梳理 编码实现 福利讲解 源码下载 下节预告 商品分类 ...
- pandas中.value_counts()用于统计数据集中的某一列
value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值.value_counts()是Series拥有的方法,一般在DataFrame中使用时 ...
- 《0day安全-软件漏洞分析技术》实验笔记1
Crack 小实验 工具 Dev C++(书上使用的VS) IDA_Pro_v7.0 Ollydbg LordPE 010 editor 使用IDA打开文件 找到程序分支点 空格跳转到汇编界面 得到V ...
- 论文阅读 | BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain
BadNets: 识别机器学习模型供应链中的漏洞 摘要 基于深度学习的技术已经在各种各样的识别和分类任务上取得了最先进的性能.然而,这些网络通常训练起来非常昂贵,需要在许多gpu上进行数周的计算;因此 ...
- mac环境提示:make sure that /usr/local/bin is in your path
今天我在Mac环境下安装了Homebrew和node.js后,输入node -v.brew.npm都提示: command not found,然后我查看了下Homebrew的安装日志,发现日志里有个 ...
- VisualBasic文件与目录管理FileSystem 类
注解 下表列出了涉及 My.Computer.FileSystem 对象的任务示例. 功能 查看 从文本文件读取 如何:读取文本文件 从带分隔符的文本文件中读取 如何:读取逗号分隔的文本文件 从固定宽 ...