您的位置:首页 > 运维架构 > Shell

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: