首页 > 技术文章 > linux shell 脚本攻略学习3

amosli 2013-12-19 01:59 原文

1.Bash中的READ命令

#读取n个字符存入变量

read -n number_of_chars variable_name

示例:

amosli@amosli-pc:~$ read -n 2 var
heamosli@amosli-pc:~$ echo $var
he

#不回显的方式读取密码

read -s var

示例:

amosli@amosli-pc:~$ read -s var
amosli@amosli-pc:~$ echo $var
pw

#显示提示信息

read -p "Enter input:" var

示例:

amosli@amosli-pc:~$ read -p "Enter input:" var
Enter input:hello,input
amosli@amosli-pc:~$ echo $var
hello,input

#限时输入

read -t  timeout var

示例:

amosli@amosli-pc:~$ read -t 2 var
var
amosli@amosli-pc:~$ echo $var
var

#设置界定符

read -d delim_char var

示例:

read -d ":" var
hello:

2.字段分隔符和迭代器 

内部字段分隔符,Internal Field Separator, IFS

IFS默认为空白字符(换行符,制表符,空格)

data="name,sex,age"
oldIFS=$IFS
IFS=,
for item in $data
do
        echo $item
done

输出:

name
sex
age

循环

for循环

for i in {a..z}; do actions; done;

or

for((i=0;i<10;i++))
{
    commands;
}

while循环

while condition
do
    commands;
done

until循环,shell中很特殊的一种循环,直到满足条件为止

示例:

amosli@amosli-pc:~/learn$ x=0;
amosli@amosli-pc:~/learn$ until  [ $x -eq 9 ];#condition 
> do let x++; echo $x;
> done
1
2
3
4
5
6
7
8
9

3.比较与测试(if、test)

 if条件:
if conditon;
then 
    commands;
fi

else if 和else;
if condtion;
then 
    commands;
elif condtion;
then 
    commands
else
    commands
fi

if和else 语句可以进行嵌套。if的条件判断部分可能会变得很长,但可以用逻辑运算符将它变得简洁一些:

[ condition  ] && action ;#如果condition为真,则执行action
[ condition ] || action ; 如果condition为假,则执行action 
&&是逻辑与运算符,||是逻辑或运算符

 算术比较:

条件通常是放置在封闭的中括号内。一定要注意在'['或者']'与操作数之间是有一个空格.如果忘记,脚本就会报错。
格式如下:
[ $var  -eq 0 ]

对变量或者值进行算术条件判断:

-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
-ne 不等于
-eq 等于

实例:

amosli@amosli-pc:~/learn$ var=3;
amosli@amosli-pc:~/learn$ if [ $var -eq 0 ];
> then
> echo "var的值为0";
> elif [ $var -lt 0 ];
> then echo "var的值小于0";
> else echo "var的值大于0";
> fi
var的值大于0

多条件:

amosli@amosli-pc:~/learn$ if [ $var -ne 0 -a $var2 -gt 2 ] ; 
then echo "var的值 不等于0并且var2的值大于2"; 
fi

var的值不等于0并且var2的值大于2
amosli@amosli-pc:~/learn$ var=1;var2=0;
amosli@amosli-pc:~/learn$ if [ $var -eq 0 -o $var2 -eq 0 ];
> then echo "var和var2有一个值为0" 
> fi
var和var2有一个值为0

-a,-o  分别表示逻辑与and 和 逻辑或or 

文件系统相关测试

 

 [ -f file_var ]:如果给定的变量包含正常的文件路径或文 件名,则返回真
 [ -x $var ] :如果给定的变量包含的文件可执行,则返回真,excute
 [ -d $var ] :如果给定的变量包含的是目录,则返回真,directory
 [ -e $var ] :如果给定的变量包含的文件存在,则返回真,exist
 [ -c $var ] :如果给定的变量包含的是一个字符设备文件的路径,则返回真
 [ -w $var ] :如果给定的变量包含的文件可写,则返回真,write
 [ -r $var ] :如果给定的变量包含的文件可读,则返回真,read
 [ -L $var ] :如果给定的变量包含的是一个符号链接,则返回真

实例:

amosli@amosli-pc:~/learn$ fpath="/home/amosli" ;
amosli@amosli-pc:~/learn$ if [ -e $fpath ];
> then 
> echo "yes";
> else echo "no";
> fi
yes

 字符串比较:最好写成双中括号,有时候单个中括号会产生错误'[[  ]]'

= 等于,前后要加上空格,也可以写成 == ,两种写法

amosli@amosli-pc:~/learn$ str1="yes";str2="yes";
amosli@amosli-pc:~/learn$ if [[ $str1 = $str2 ]] 
> then 
> echo  "str1等于str2"
> fi
str1等于str2

!= 不等于

amosli@amosli-pc:~/learn$ if [[ $str1 != $str2 ]] ; then  echo  "str1不等于str2";  else  echo "str1等于str2"; fi
str1等于str2

比较字母顺序的大小:

[[ $str1 > $str2 ]]

[[ $str1 < $str2 ]]

判断是否为空字符串

[[ -z $str1 ]]#是空字符串,zero
[[ -n $str2 ]]#不是空字符串,not zero

使用||,&&进行联合判断:

amosli@amosli-pc:~/learn$ if [[ -n $str1 ]] && [[ -z $str2 ]] ; then echo "str1 is not  empty and str2 is empty"; fi
str1 is not  empty and str2 is empty

test命令可以用来执行条件检测

amosli@amosli-pc:~/learn$ if test -n $str1; then echo "str1 is not empty"; fi
str1 is not empty

上面的例子可用 test命令改写为:

amosli@amosli-pc:~/learn$ if test -n $str1 && test -z $str2 ;
> then  echo "str1 is not  empty and str2 is empty"; fi
str1 is not  empty and str2 is empty

 

 

 

推荐阅读