catinput.txt
cat<&3
数组和关联数组
数组是shell脚本重要的组成部分,它借助索引将多个独立的数据存储为一个集合
普通数组只能使用整数作为数组索引,关联数组可以使用字符串作为数组索引
一、数组
将数组定义为一组索引值
[root@localhost~]#array_var[0]="test1"
[root@localhost~]#array_var[1]="test2"
[root@localhost~]#array_var[2]="test3"
[root@localhost~]#array_var[3]="test4"
[root@localhost~]#array_var[4]="test5"
[root@localhost~]#array_var[5]="test6"
打印出特定索引的数组元素内容
[root@localhost~]#echo${array_var[1]}
[root@localhost~]#index=5
[root@localhost~]#echo${array_var[$index]}
以清单形式打印出数组中的所有值
[root@localhost~]#echo${array_var[*]}
test1test2test3test4test5test6
[root@localhost~]#echo${array_var[@]}
test1test2test3test4test5test6
打印数组长度
[root@localhost~]#echo${#array_var[*]}
6
二、关联数组
1、使用语句单独声明将一个变量名为关联数组
[root@localhost~]#declare-Afruits_value
[root@localhost~]#fruits_value=([apple]='100dollars'[orange]='150dollars')
[root@localhost~]#echo"applecosts${fruits_value[apple]}"
applecosts100dollars
[root@localhost~]#
2、列出数组索引
[root@localhost~]#echo${!
fruits_value[*]}
orangeapple
[root@localhost~]#echo${!
array_var[*]}
012345
3、别名alias
别名配置文件目录vim~/.bashrc
aliasrm='cp$@~/backup;rm$@'
当你创建别名时,如果已经有同名的别名存在,那么原有的别名设置将被新的取代
获取终端信息
获取终端的行数和列数
bel警铃
blink闪烁模式
bold粗体
civis隐藏光标
clear清屏
cnorm不隐藏光标
cup移动光标到屏幕位置(x,y)
el清除到行尾
ell清除到行首
smso启动突出模式
rmso停止突出模式
smul开始下划线模式
rmul结束下划线模式
sc保存当前光标位置
rc恢复光标到最后保存位置
sgr0正常屏幕
rev逆转视图
[root@localhost~]#tputcols
105
[root@localhost~]#tputlines
23
打印出当前终端名
[root@localhost~]#tputlongname
xtermterminalemulator(XWindowSystem)[root@localhost~]#
将光标移到到方位(100100)处
root@localhost~]#tputcup100100
[root@localhost~]#
设置终端背景色范围0--7
[root@localhost~]#tputsetb1
设置下划线关闭
[root@localhost~]#tputsmul
[root@localhost~]#tputrmul
在输入密码的时候,不显示出来
[root@localhost~]#catpd.sh
#!
/bin/bash
echo-e"Enterpassword:
"
stty-echo(终端不显示)
readpassword(可输人内容)
sttyecho(终端输出内容)
echo(空行)
echoPasswordread
[root@localhost~]#
获取、设置日期和延迟
打印纪元时,显示出来的为秒
date+%s
设置日期时间
[root@localhost~]#date"+%d%b%Y"
30Jul2014
[root@localhost~]#date-s"2015-3-2515:
45:
00"
WedMar2515:
45:
00CST2015
延迟
[root@localhost~]#catsleep.sh
#!
/bin/bash
echo-ncount:
输出count'
tputsc保存当前光标位置
count=0;从0开始
whiletrue;
do
if[$count-lt40];小于40的数字
thenletcount++;
sleep1;延迟1秒
tputrc恢复光标到最后保存位置
tputed删除当前光标位置到行尾的所有内容
echo-n$count;
elseexit0;
fi
done
调试脚本
Set+x:
在执行时显示参数和命令
Set-x:
禁止调试
Set-v:
当命令进行读取时显示输入
Set+v:
禁止打印输入
[root@localhost~]#catbash.sh
#!
/bin/bash
foriin{1..6}
do
set-x
echo$i
set+x
done
echo"scriptexecuted"
自定义格式显示调试信息
[root@localhost~]#catbash.sh
#!
/bin/bash
functionxf()
{
["$_DEBUG"=="on"]&&$@||:
}
foriin{1..10}
do
xfecho$i
done
执行结果
[root@localhost~]#_DEBUG=on./bash.sh
1
2
3
4
5
6
7
8
9
10
读取命令返回值
[root@localhost~]#catcommand.sh
#!
/bin/bash
CMD=$1
ls$CMD>>out.txt2>&1
if[$?
-eq0];
then
echo"$CMDexecutedsuccessfully"
else
echo"$CMDexectuedunsuccessfuly"
fi
Read
Read是一个重要的bash命令,用于从键盘或标准输入中读取文本,我们可以使用read以交互的形式读取来自用户的输入
Read-n2var输入两个字符读入变量var
Read-svar以不会显的方式输入密码
Read-p"Enterinput:
"var以Enterinput:
显示提示信息
Read-d":
"var以定界符:
结束输入行
字段分隔符和迭代器
内部字段分隔符(IFS):
是shell脚本中的一个重要概念,在处理文本数据时,她可是相当有用。
我们将讨论把单个数据流划分成不同数据元素的定界符。
内部字段分隔符是用于特定用途的定界符。
IFS是存储定界符的环境变量。
它是当前shell环境使用的默认定界字符串。
迭代器:
我们需要一个迭代字符串或者CSV逗号分割型数值。
在前者中,我们使用IFS=".",在后者中则使用IFS=","
实列
[root@localhost~]#catifs
#!
/bin/bash
date="name,sex,rollno,location"
IFS=,
#oldIFS=$IFS
foritemin$date
do
echoItem:
$item
done
#IFS=$oldIFS
[root@localhost~]#bashifs
Item:
name
Item:
sex
Item:
rollno
Item:
location
[root@localhost~]#
#!
/bin/bash
IFS=":
"
line="admin:
x:
500:
500:
:
/home/admin:
/bin/bash"
count=0
foriin$line;
do
[$count-eq0]&&user=$i
[$count-eq6]&&shell=$i
letcount++
done
echo"$user'sshellis$shell"
[root@localhost~]#bashshel
admin'sshellis/bin/bash
Linux下seq的使用
-f:
用来格式化输出
-s:
用来指定分隔符号,默认是回车
-w:
输出同宽数列,不足的位数用0补齐
[root@gechong~]#seq-f100%g10
1001
1002
1003
1004
1005
1006
1007
1008
1009
10010
[root@gechong~]#seq1310
1
4
7
10
[root@gechong~]#seq-s"+"10
1+2+3+4+5+6+7+8+9+10
[root@gechong~]#seq-s"+"100|bc
5050
[root@gechong~]#seq-w10
01
02
03
04
05
06
07
08
09
10
一个简单的脚本实现1000以内偶数求和
[root@gechong~]#moretest.sh
#!
/bin/sh
#gechong_1106_sum
fir=0;
res=0;
foriin$(seq$fir21000);do
res=$(($res+$i));
done;
echo"Theresultis:
"$res;
For循环
脚本名称叫test.sh入参三个:
123
运行test.sh123后
$*为"123"(一起被引号包住)
$@为"1""2""3"(分别被包住)
$#为3(参数数量)
[root@localhost~]#catfora
#!
/bin/bash
for((i=1;i<=10;i++));
do
echo$(expr$i\*4);
done
[root@localhost~]#catfor
#!
/bin/bash
list={1.2.3.4.5.6.7.8.9.10}
IFS=.
foriin$list
do
echo"$i"
done
[root@localhost~]#cataa
#!
/bin/bash
foriin{1..6}
do
#set-x
echo$i
#set+x
done
echo"scriptexecuted"
[root@localhost~]#catone
#!
/bin/bash
forxinonetwothreefour
do
echonumber$x
done
[root@localhost~]#catbb
#!
/bin/bash
foriiiin"$@"
do
echoyoutyped${iii}
done
用for循环在家目录下创建aaa1-aaa10,然后在aaa1-aaa10创建bbb1-bbb10的目录
#!
/bin/bash
foriin{1..10}
do
mkdir/home/aaa$i
cd/home/aaa$i
forlin{1..10}
do
mkdir/home/aaa$i/bbb$l
done
done
While
∙-lt,小于
∙-le,小于等于
∙-eq,等于
∙-ge,大于等于
∙-gt,大于
∙-ne,不等于
循环输出1到10的数字
#!
/bin/bash
myvar=1
while[$myvar-le10]
do
echo$myvar
myvar=$(($myvar+1))
done
注:
只要特定条件为真,”while”语句就会执行
当输入bye时结束shell
[root@localhost~]#catas
#!
/bin/bash
echo"enteranumber:
"
readvar
while[$var!
="bye"]
do
echo"yourinputis:
$var"
readvar
done
取1到10的和
[root@localhost~]#catdd
#!
/bin/bash
declare-ii=1
declare-isum=0
while((i<=10))
do
letsum+=i
let++i
done
echo$sum
行2-3,声明i和sum为整数型
行4,如果条件测试:
只要i值小于或者等于10,就执行循环。
行6,sum+=i和sum=sum+i是一样的,sum累加上i。
行7,i的值递增1,此行是改变条件测试的命令,一旦i大于10,可终止循环。
行8,遇到done,回到行6去执行条件测试
行9,显示sum的值为55
Until
(除非你想要执行无穷循环)
取1到10的和
[root@localhost~]#catdd
#!
/bin/bash
declare-ii=1
declare-isum=0
until((i<=10))
do
letsum+=i
let++i
done
echo$sum
#!
/bin/bash
myvar=1
until[$myvar-gt10]
do
echo$myvar
myvar=$(($myvar+1))
done
变量自增,目前有五种方法
#!
/bin/bash
i=0;
while[$i-lt4];
do
echo$i;
i=`expr$i+1`;
#leti+=1;
#((i++));
#i=$[$i+1];
#i=$(($i+1))
done
比较和测试
一:
条件测试
1. 语法:
test条件表达式或