shell-bash学习04读取输入、分隔符、流程控制
2015-11-21 12:34
603 查看
读入输出
输入通常是通过stdin或参数传递给命令;
输出出现在
stderr或
stdout;
管道,过滤器,管道操作符:
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 if和
else
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编程之一基础
- Xshell连接虚拟机的最简单方式
- Citrix Xen300上海培训之我见
- 我从其他Shell脚本中学到了什么?
- linux shell编程 5 判断登陆用户,然后重启关闭系统
- linux shell 编程4 判断当前的是不是目录、 传递参数的个数
- Git版本库理解和Git bash 命令行
- linux 命令及shell 知识小点汇集
- shell之nginx安装+虚拟主机
- 老李分享:《Linux Shell脚本攻略》 要点(二)
- 老李分享:《Linux Shell脚本攻略》 要点(一)
- hbase shell基本命令
- Centos7下将Shell脚本转换为Systemctl start&stop Service
- Linux中profile、bashrc、bash_profile之间的区别和联系
- shell sort
- shell不能执行su 后的脚本
- shell 用telnet检查服务端口是否打开 【高效】
- MySQL Database on Azure - 利用PowerShell快速创建使用数据库服务
- MySQL Database on Azure - 利用PowerShell快速创建使用数据库服务
- MySQL Database on Azure - 利用PowerShell快速创建使用数据库服务