读入输出

  • 输入通常是通过stdin或参数传递给命令;
  • 输出出现在stderrstdout;
  • 管道,过滤器,管道操作符: cmd1 | cmd2 | cmd3;
//最后还有输出
ls | cat -n //最后没有输出
ls cat -n > out.txt //读取由管道相连的命令序列的输出
cmd_output=$(ls | cat -n)
echo $cmd_output
//同上,反引用
cmd_output=`ls | cat -n`
echo $cmd_output

shell

  • 使用()操作符来定义一个子shell生成一个独立的进程;
  • 命令在子shell中执行时,不会对当前shell有任何影响;
pwd;
(cd /bin; ls);
pwd;
  • 通过引用子shell保留空格和换行符;
$ cat text.txt
1
2
3
 
$ out=$(cat text.txt)
$ echo $out
1 2 3 # Lost \n spacing in 1,2,3
 
$ out="$(cat tex.txt)"
$ echo$out
1
2
3

读取输入字符

  • 使用read命令,用于从键盘或标准输入中读取文本;

  • 从输入中读取n个字符并存入变量

read -n 2 var
echo $var
  • 读取回车之前的输入字符
//不显示输入
read -s var //显示输入
read -p "Enter input:" var
  • 在特定时限内读取输入
//2s
read -t 2 var
  • 用特定的定界符作为输入行的结束
read -d ":" var

重复命令直到成功

  • 基本结构
repeat()
{
while true
do
$@ && return
done
}
//
repeat() { while true; do $@ && return; done }

优化

  • 大多数现代系统中,true是作为/bin中的一个二进制文件来实现的;这就意味着每执行一次while循环,shell就不得不生成一个进程
  • 使用shell内建的:命令,它总是会返回为0的退出码;
repeat() { while :; do $@ && return; done }
  • 增加延迟
//30s
repeat() { while :; do $@ && return; sleep 30; done }

字段分隔符和迭代器

内部字段分隔符(IFS)

  • 存储定界符的环境变量,当前shell环境使用的默认定界字符串;
  • 默认值为空白字符(换行符,制表符或者空格);
data="name,sex,rollno,location"

oldIFS=$IFS
IFS=, //将逗号作为定界符;否则将全部数据作为单个字符串打印出来
for item in $data;
do
echo Item: $item
done IFS=$oldIFS //输出
Item: name
Item: sex
Item: rollno
Item: location
  • 筛选
#!/bin/bash
#用途: 演示IFS的用法
line="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS;
IFS=":"
count=0
for item in $line;
do
[ $count -eq 0 ] && user=$item;
[ $count -eq 6 ] && shell=$item;
let count++
done;
IFS=$oldIFS
echo $user\'s shell is $shell; //输出
root's shell is /bin/bash

流程控制

判断

  • if条件
if condition;
then
commands;
fi
  • else ifelse
if condition;
then
commands;
else if condition; then
commands;
else
commands;
fi
  • 优化
[ condition ] && action; #如果condition为真,则执行action;

[ condition ] || action; #如果condition为假,则执行action。

循环

  • for循环
for var in list;   //list可以是一个字符串,也可以是一个序列。
do
commands; #使用变量$var
done //
for((i=0;i<10;i++))
{
commands; #使用变量$i
}
  • while循环
while condition
do
commands;
done
  • until循环
x=0;
until [ $x -eq 9 ]; #条件是[$x -eq 9 ]
do
let x++; echo $x;
done

比较

  • 条件通常被放置在封闭的中括号内。一定要注意在[]与操作数之间有一个空格。

  • 算术比较

[ $var -eq 0 ]

//
-gt:大于
-lt:小于
-ge:大于或等于
-le:小于或等于 //
[ $var1 -ne 0 -a $var2 -gt 2 ] #使用逻辑与-a
[ $var1 -ne 0 -o var2 -gt 2 ] #逻辑或 -o
  • 文件系统相关测试
[ -f $file_var ]:如果给定的变量包含正常的文件路径或文件名,则返回真。

[ -x $var ]:如果给定的变量包含的文件可执行,则返回真。

[ -d $var ]:如果给定的变量包含的是目录,则返回真。

[ -e $var ]:如果给定的变量包含的文件存在,则返回真。

[ -c $var ]:如果给定的变量包含的是一个字符设备文件的路径,则返回真。

[ -b $var ]:如果给定的变量包含的是一个块设备文件的路径,则返回真。

[ -w $var ]:如果给定的变量包含的文件可写,则返回真。

[ -r $var ]:如果给定的变量包含的文件可读,则返回真。

[ -L $var ]:如果给定的变量包含的是一个符号链接,则返回真。
  • 字符串比较: 使用字符串比较时,最好用双中括号
//相同
[[ $str1 = $str2 ]] //注意等号前后空格
[[ $str1 == $str2 ]] //不同
[[ $str1 != $str2 ]] //字母序
[[ $str1 > $str2 ]]
[[ $str1 < $str2 ]] //空字符串
[[ -z $str1 ]] //非空
[[ -n $str1 ]]
if [[ -n $str1 ]] && [[ -z $str2 ]] ;
then
commands;
fi
  • test命令可以用来执行条件检测
if  [ $var -eq 0 ]; then echo "True"; fi

if  test $var -eq 0 ; then echo "True"; fi

shell-bash学习04读取输入、分隔符、流程控制的更多相关文章

  1. Shell从入门到精通进阶之四:流程控制

    流程控制是改变程序运行顺序的指令. 4.1 if语句 4.1.1 单分支 if 条件表达式; then 命令 fi 示例: #!/bin/bash N=10 if [ $N -gt 5 ]; then ...

  2. 【Python】Java程序员学习Python(六)— 流程控制、异常处理

    和Java语言一样,Python也有基本的流程控制,简单了解下即可. 一.流程控制的元素 条件 条件就是布尔值或者布尔值的表达式,要么是True要么是False. 代码块 在Python中,代码块不是 ...

  3. python 学习之 基础篇三 流程控制

    前言: 一. python中有严格的格式缩进,因为其在语法中摒弃了“{}”来包含代码块,使用严格的缩进来体现代码层次所以在编写代码的时候项目组要严格的统一器缩进语法,一个tab按键设置为四个空格来缩进 ...

  4. Java学习笔记之:Java流程控制

    一.介绍 Java流程控制包括顺序控制.条件控制和循环控制. 顺序控制,就是从头到尾依次执行每条语句操作.条件控制,基于条件选择执行语句,比方说,如果条件成立,则执行操作A,或者如果条件成立,则执行操 ...

  5. python的学习笔记01_3 基本运算符 流程控制if while 字符串常用办法

    基本运算符 运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算,今天我们暂只学习算数运算.比较运算.逻辑运 ...

  6. 04 if条件判断 流程控制

    条件判断 if 语法一: if 条件: # 条件成立时执行的子代码块 代码1 代码2 代码3 示例: sex='female' age=18 is_beautiful=True if sex == ' ...

  7. GO语言学习——Go语言基础之流程控制一

    Go语言基础之流程控制 if else(分支结构) package main import "fmt" // if条件判断 func main(){ // age := 19 // ...

  8. python学习day5 常量 运算符补充 流程控制基础

    1.常量 值不会改变的量 python中没有特别的语法定义常量,一般约定用全大写字母命名常量,比如圆周率pi 2.预算符补充 2.1算数运算符 print(10/3)除法运算 print(10//3) ...

  9. Lua学习笔记(2): 流程控制与循环以及初涉迭代器

    条件判断语句 --if...语句 if (表达式) then --表达式为1时执行的语句 end --if...else语句 if (表达式) then --表达式为1时执行的语句 else --表达 ...

随机推荐

  1. BestCoder20 1002.lines (hdu 5124) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5124 题目意思:给出 n 条线段,每条线段用两个整数描述,对于第 i 条线段:xi,yi 表示该条线段 ...

  2. 穹举,迭代,while循环。

    所有循环  必要条件 :   初始条件(注意初始条件的位置)   循环条件   循环体   状态改变: 1.穷举 将所有可能性全部全部走一遍,使用IF筛选出满足的情况 使用循环语句    for   ...

  3. python安装paramiko模块

    一.简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...

  4. java获取客服端信息(系统,浏览器等)

    String agent = request.getHeader("user-agent"); System.out.println(agent); StringTokenizer ...

  5. 单独编译osgQt模块 Qt moc

    从alphapixel网站下载了OSG3.0.1VS2010x64版本的库,但是里面不包括osgQt模块,于是得自己编译 *************osgQtx64.zip工程文件可以去本博客园的“文 ...

  6. java中带继承类的加载顺序详解及实战

    一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩 ...

  7. Mysql源码分析--csv存储引擎

    一直想分析下mysql的源码,开始的时候不知道从哪下手,先从csv的文件存储开始吧,这个还是比较简单的.我是用的是mysql5.7.16版本的源码. csv源码文件在mysql源码的mysql-5.7 ...

  8. 字典树(codevs 4189)

    4189 字典  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description 最经,skyzhong得到了 ...

  9. AngularJS模型 ng-model 指令

    ng-model 指令用于绑定应用程序数据到 HTML 控制器(input, select, textarea)的值. ng-model 指令可以将输入域的值与 AngularJS 创建的变量绑定.例 ...

  10. Shell编程基础教程6--shell函数

    6.shell函数    6.1.定义函数        简介:            shell允许将一组命令集或语句形成一个可用块,这些块成为shell函数        定义函数的格式      ...