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