shell(二)
1、case语句
-
[root@localhost day1121]# cat test1.sh #!/bin/bash case $1 in "1") echo "您输入的是1" ;; "2") echo "您输入的是2" ;; *) echo "您输入的是其他" ;; esac [root@localhost day1121]# bash test1.sh 您输入的是其他 [root@localhost day1121]# bash test1.sh 1 您输入的是1 [root@localhost day1121]#
-
案例: 判断⽤户输⼊的字符类型使⽤case,字母类型[a-z][A-Z] 数字类型[0-9] 其他
[root@localhost day1121]# cat test2.sh #!/bin/bash read -p "请输入任意一个字符" ch case $ch in [A-Z] | [a-z]) echo "字母" ;; [0-9]) echo "数字" ;; *) echo "其他" ;; esac [root@localhost day1121]# bash test2.sh 请输入任意一个字符a 字母 [root@localhost day1121]# bash test2.sh 请输入任意一个字符1 数字 [root@localhost day1121]# bash test2.sh 请输入任意一个字符/ 其他 [root@localhost day1121]#
2、循环语句
-
for 变量 in 空格分隔的数据列表;do 语句块 done
[root@localhost day1121]# cat test3.sh #!/bin/bash for i in 1 2 3 4 5 do echo $i done [root@localhost day1121]# bash test3.sh 1 2 3 4 5 [root@localhost day1121]# cat test4.sh #!/bin/bash for i in $* do echo $i done [root@localhost day1121]# bash test4.sh [root@localhost day1121]# bash test4.sh [root@localhost day1121]# bash test4.sh aa bb cc aa bb cc [root@localhost day1121]#
-
for 变量 in {起始值..终⽌值..步进值};do 语句块 done
[root@localhost day1121]# cat test5.sh #!/bin/bash for i in {1..5..1} do echo $i done [root@localhost day1121]# bash test5.sh 1 2 3 4 5 [root@localhost day1121]# cat test6.sh #!/bin/bash for i in {101..105..1} do echo hadop$i done [root@localhost day1121]# bash test6.sh hadop101 hadop102 hadop103 hadop104 hadop105 [root@localhost day1121]# cat test7.sh #!/bin/bash for i in hadop{101..105} do echo $i done [root@localhost day1121]# bash test7.sh hadop101 hadop102 hadop103 hadop104 hadop105 [root@localhost day1121]#
-
for (( 初始值; 条件判断; 步进值 )) ;do 语句块 done
[root@localhost day1121]# cat test8.sh #!/bin/bash for ((i=1;i<=5;i++)) do echo $i done [root@localhost day1121]# bash test8.sh 1 2 3 4 5 [root@localhost day1121]#
-
while循环
-
初始计数器 while [ 计数器判断 ] do 语句块 计数器步进done
[root@localhost day1121]# cat test9.sh #!/bin/bash i=1 while [ $i -le 5 ] do echo $i let i=i+1 done [root@localhost day1121]# bash test9.sh 1 2 3 4 5 [root@localhost day1121]#
-
break 退出循环 , continue 重新进⼊下次循环
[root@localhost day1121]# cat test10.sh #!/bin/bash #break continue i=1 while [ $i -le 10 ] do echo $i let i=i+1 if [ $i -eq 6 ] then break fi done [root@localhost day1121]# bash test10.sh 1 2 3 4 5 [root@localhost day1121]#
[root@localhost day1121]# cat test11.sh #!/bin/bash #break continue i=0 while [ $i -lt 10 ] do let i=i+1 if [ $i -eq 7 ] then continue fi echo $i done [root@localhost day1121]# bash test11.sh 1 2 3 4 5 6 8 9 10 [root@localhost day1121]#
-
-
until 否定 while
#!/bin/bash i=1 until [ $1 -ge 5 ] do echo $i let i=i+1 done
-
练习: 求1-100的和
[root@localhost day1121]# cat test13.sh #!/bin/bash sum=o for ((i=1;i<=100;i++)) do let sum=i+sum done echo "1+2+3+...+100=${sum}" [root@localhost day1121]# bash test13.sh 1+2+3+...+100=5050 [root@localhost day1121]#
- 练习 99乘法表
[root@localhost day1121]# cat test14.sh #!/bin/bash for ((i=1;i<=9;i++)) do for ((j=1;j<=i;j++)) do echo -ne "$i*$j=$((i*j))\t" done echo done [root@localhost day1121]# bash test14.sh 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 [root@localhost day1121]#
-
脚本的语法检查和跟踪执⾏
-
bash -n 仅检查语法
-
bash -v 根据语句执⾏
-
bash -x 根据命令执⾏
-
-
使⽤shell脚本 在后台运⾏, nohup 表⽰不挂起执⾏
-
nohup 命令 >⽂件 2>&1 & (注:如果不指定⽂件会默认⽣成nohup.out)
-
vim test01.sh #!/bin/bash while true do date "+%H:%M:%S" >> out.txt sleep 1 done 如果直接执⾏ bash test01.sh 光标会⼀直在前台闪烁,不能再运⾏其他命令,ctrl+c停⽌,给它转到 后台运⾏bash test01.sh & nohup bash test01.sh & 即使这运⾏的窗⼝关闭或断开 连接 或注销后,还会继续执⾏
-
使⽤jobs命令查看 后台正在运⾏的进程
[root@hadoop101 day11212]# bash test01.sh& [1] 37331 [root@hadoop101 day11212]# jobs [1]+ 运⾏中 bash test01.sh&
-
bg 任务号 将后台暂停的命令运⾏起来, 可以通过 jobs -l 查看运⾏的使⽤号 使⽤bg 任务号运⾏起来
[root@hadoop101 day11212]# bash test01.sh ^Z (ctrl+z) 暂停前台运⾏ [1]+ 已停⽌ bash test01.sh [root@hadoop101 day11212]# jobs -l [1]+ 42086 停⽌ bash test01.sh [root@hadoop101 day11212]# bg 1 [1]+ bash test01.sh &
-
fg 任务号8 ,将后台暂停的程序,改为前台运⾏
- 停止运行
-
停⽌前台的运⾏ ctrl+c
-
停⽌后台运⾏ kill -9 xxx
[root@hadoop101 day11212]# jobs -l [1]+ 42086 运⾏中 bash test01.sh & [root@hadoop101 day11212]# kill -9 42086 [root@hadoop101 day11212]# jobs -l [1]+ 42086 已杀死 bash test01.sh
-
-
$RANDOM 表示随机⽣成变量 [0-32767]
-
⽣成0-25数字
echo $(($RANDOM%26))
-
⽣成 1-25数字
-
0-25 %26
-
0+1 - 25+1
echo $(($RANDOM%25+1))
-
游戏 猜数0-100
#!/bin/bash #猜数 1-100 ((cp=$RANDOM%100+1)) echo $cp while true do read -p "请输⼊1-100之间的数字:"num1 if [ $cp -eq $num1 ] then echo "中中中" break elif [ $cp -gt $num1 ] then echo "⼩" else echo "⼤" fi done
-
-
-
数组
-
定义数组 数组名=(元素1 元素2 ....)
-
引⽤元素值 ${数组名[下标]}
-
修改值 数组名[下标]=新值 如: let a[2]=33 或 ((a[2]=33))
-
获取数组长度 ${#数组名[*]}
-
获取数组长度 ${#数组名[@]}
-
获取数组的下标集合 ${!数组名[@]}
-
获取数组元素集合 ${数组名[@]}
- 例子
#!/bin/bash array=(aa bb cc dd ee) for((i=0;i<${#array[@]};i++)) do echo ${array[i]} done #!/bin/bash array=('aa' 'bb' 'cc' 'dd' 'ee') for((i=0;i<${#array[@]};i++)) do echo ${array[i]} done #!/bin/bash array=(aa bb cc dd ee) for i in ${array[@]} do echo $i done
-
函数
-
function 函数名(){ 函数体}
#!/bin/bash #函数 function fun1(){ echo "hello" } #调⽤ #fun1 function fun2(){ echo hello ${1} and ${2} } #调⽤ #fun2 tom jerry fun2 $1 $2 [root@hadoop101 day11212]# bash test0 6.sh linux shell hello linux and shell
-
返回值, 通过return返回,再通过$?获取返回值, 返回值必须是0-255之间, 默认是0成功,其他是失败
#!/bin/bash #函数 function fun1(){ echo "hello" } #调⽤ #fun1 function fun2(){ echo 'hello $1 and $2' return 1 } #调⽤ #fun2 tom jerry fun2 $1 $2 echo 返回值是$?
-
-
TMOUT 指定 read命令的等待时间 -t效果⼀样
#!/bin/bash #TMOUT #TMOUT=5 read -p "请输⼊你的名字" -t 3 name if [[ $? -eq 0 ]] then echo "你的名字是$name" else echo -e "\n超时" fi [root@hadoop101 day11212]# bash test07.sh 请输⼊你的名字张三 你的名字是张三 [root@hadoop101 day11212]# bash test07.sh 请输⼊你的名字超时
-
-