以下内容仅为个人学习使用,如有错误,欢迎指出
持续更新……………
一.首先创建.sh文件,打开并在文件的第一行输入**#!/bin/sh**
执行shell文件命令为:
. filename.sh
source filename.sh
二.常用命令
1.echo命令,变量
第二次变量赋值时,不用加$号,只有使用时才加
1 2 3 4 5 6 7 8 test='我是变量' echo "$test" 或者 echo $test #如果这种情况使用变量,只需要在变量外加{}号 echo "it's num $testtest" #改为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 echo "it's num ${test}test" #只读变量 var="variable" readonly #删除变量 unset var_name #注意:只读变量是不可修改和删除的 #获取字符串长度 echo ${#var} #截取字符串 echo ${var:1:3} #定义数组格式
1 2 3 array_name=(value0 value1 value2 value3) #读取数组格式
1 2 3 valuen=${array_name[n]} #读取数组长度,或者@变成*
1 2 3 4 5 6 length=${#array_name[@]} #echo显示换行可以使用 echo -e "it \n is" #显示结果到文件
1 echo "It is a test" > myfile
2.注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #单行注释 # ------------------------- :<<EOF 多行注释 多行注释 多行注释 多行注释 EOF 或 :<<' 多行注释 多行注释 多行注释 ' 又或者 :<<! 多行注释 多行注释 多行注释 !
3.read命令
用来读取用户在控制台上输入的内容
1 2 3 4 5 6 echo "please input you content" #这里content自定义,就是一个变量名 read content echo "you input content is $content"
三.参数传递(函数调用的参数调用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/sh echo "共有$#个参数" echo "第一个参数为:$1" echo "第二个参数为:$2" echo "所有参数:$*" echo "脚本运行的当前进程id号为:$$" if [ $? == 0 ] then echo "当前程序没有错误" else echo "程序发生错误" fi
结果为:
当程序没有发生错误时,$?就会返回0
1 2 3 4 5 6 7 msw@bogon:~/Desktop$ . fun.sh 2 5 共有2个参数 第一个参数为:2 第二个参数为:5 所有参数:2 5 脚本运行的当前进程id号为:92957 当前程序没有错误
2.特殊字符处理参数:
参数处理
说明
$#
传递到脚本的参数个数
$*
以一个单字符串显示所有向脚本传递的参数
$$
脚本运行的当前进程ID号
$!
后台运行的最后一个进程的ID号
$@
与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-
显示Shell使用的当前选项,与set命令功能相同。
$?
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
四.数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #!/bin/sh #可以这样定义数组 new_array=('a' 2 'c' 4) echo "The first element is ${new_array[0]}" echo "Second element is ${new_array[1]}" #获取数组的所有元素 echo "all element ${new_array[*]}" echo "all element ${new_array[@]}" #获取数组的长度 echo "element count is ${#new_array[*]}" # 也可以这样 two_array[0]=0 two_array[1]='b' echo "The first element is ${two_array[0]}" echo "Second element is ${two_array[1]}"
结果为:
1 2 3 4 5 6 7 The first element is a Second element is 2 all element a 2 c 4 all element a 2 c 4 element count is 4 The first element is 0 Second element is b
五.循环大法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/sh new_array=('a' 2 'c' 4) # for 循环 echo "-----for cycle----" for i in ${new_array[*]}; do echo $i done #while 循环 echo "-----while cycle----" n=0 while [ $n -lt ${#new_array[@]} ] do echo ${new_array[$n]} # let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式 let n++ done
结果为:
1 2 3 4 5 6 7 8 9 10 11 -----for cycle---- a 2 c 4 -----while cycle---- a 2 c 4
六.运算符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/bin/sh a=8 b=5 echo "加 : `expr $a + $b `" echo "减 : `expr $a - $b `" echo "乘 : `expr $a \* $b `" echo "除 : `expr $a / $b `" echo "取余 : `expr $a % $b `" if [ $a == $b ] then echo "a==b" fi if [ $a != $b ] then echo "a!=b" fi
结果为:
1 2 3 4 5 6 加 : 13 减 : 3 乘 : 40 除 : 1 取余 : 3 a!=b
注意条件表达式的两边一定要留空格,否则会将运算表达式直接输出
1 2 3 4 msw@bogon:~/Desktop$ expr 1+2 1+2 msw@bogon:~/Desktop$ expr 1 + 2 3
这只是算数运算符,还有
2.关系运算符:
运算符
说明
举例
-eq
检测两个数是否相等,相等返回 true。
[ $a -eq $b ] 返回 false。
-ne
检测两个数是否不相等,不相等返回 true。
[ $a -ne $b ] 返回 true。
-gt
检测左边的数是否大于右边的,如果是,则返回 true。
[ $a -gt $b ] 返回 false。
-lt
检测左边的数是否小于右边的,如果是,则返回 true。
[ $a -lt $b ] 返回 true。
-ge
检测左边的数是否大于等于右边的,如果是,则返回 true。
[ $a -ge $b ] 返回 false。
-le
检测左边的数是否小于等于右边的,如果是,则返回 true。
[ $a -le $b ] 返回 true。
3.布尔运算符:
运算符
说明
举例
!
非运算,表达式为 true 则返回 false,否则返回 true。
[ ! false ] 返回 true。
-o
或运算,有一个表达式为 true 则返回 true。
[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a
与运算,两个表达式都为 true 才返回 true。
[ $a -lt 20 -a $b -gt 100 ] 返回 false。
4.逻辑运算符:
运算符
说明
举例
&&
逻辑的 AND
[[ $a -lt 100 && $b -gt 100 ]] 返回 false
5.字符串运算符:
运算符
说明
举例
=
检测两个字符串是否相等,相等返回 true。
[ $a = $b ] 返回 false。
!=
检测两个字符串是否相等,不相等返回 true。
[ $a != $b ] 返回 true。
-z
检测字符串长度是否为0,为0返回 true。
[ -z $a ] 返回 false。
-n
检测字符串长度是否为0,不为0返回 true。
[ -n “$a” ] 返回 true。
str
检测字符串是否为空,不为空返回 true。
[ $a ] 返回 true。
6.文件测试测试运算符 :
操作符
说明
举例
-b file
检测文件是否是块设备文件,如果是,则返回 true。
[ -b $file ] 返回 false。
-c file
检测文件是否是字符设备文件,如果是,则返回 true。
[ -c $file ] 返回 false。
-d file
检测文件是否是目录,如果是,则返回 true。
[ -d $file ] 返回 false。
-f file
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
[ -f $file ] 返回 true。
-g file
检测文件是否设置了 SGID 位,如果是,则返回 true。
[ -g $file ] 返回 false。
-k file
检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
[ -k $file ] 返回 false。
-p file
检测文件是否是有名管道,如果是,则返回 true。
[ -p $file ] 返回 false。
-u file
检测文件是否设置了 SUID 位,如果是,则返回 true。
[ -u $file ] 返回 false。
-r file
检测文件是否可读,如果是,则返回 true。
[ -r $file ] 返回 true。
-w file
检测文件是否可写,如果是,则返回 true。
[ -w $file ] 返回 true。
-x file
检测文件是否可执行,如果是,则返回 true。
[ -x $file ] 返回 true。
-s file
检测文件是否为空(文件大小是否大于0),不为空返回 true。
[ -s $file ] 返回 true。
-e file
检测文件(包括目录)是否存在,如果是,则返回 true。
[ -e $file ] 返回 true。
注意:使用 [[ … ]] 条件判断结构,而不是 [ … ],能够防止脚本中的许多逻辑错误。比如,&& 、|| 、<** 和 **> 操作符能够正常存在于 [[ ]] 条件判断结构中,但是如果出现在 [ ] 结构中的话,会报错。
用法就不一一介绍了
七.流程控制
上面和下面都用过了,此处就不在举例了
1.if…elif…else:格式如下
1 2 3 4 5 6 7 8 9 if condition1 then command1 elif condition2 then command2 else commandN fi
2.for 循环:格式如下
1 2 3 4 5 6 7 for var in item1 item2 ... itemN do command1 command2 ... commandN done
3.死循环:或while true
1 2 3 4 while : do command done
4.until循环:与while循环刚好相反,until 循环执行一系列命令直至条件为 true 时停止。
1 2 3 4 until condition do command done
例:循环输出n,直到n大于5
1 2 3 4 5 6 7 8 #!/bin/sh n=0 until [ $n -gt 5 ] do echo $n let n++ done
结果为:
5.case:Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/sh echo "input you name first letter" read name case $name in 'm') echo "you is msw" ;; 'w') echo "you is wbd" ;; *) echo "i don't know you" ;; esac
结果为:
1 2 3 4 5 6 7 8 9 10 11 12 msw@bogon:~/Desktop$ . case.sh input you name first letter m you is msw msw@bogon:~/Desktop$ . case.sh input you name first letter w you is wbd msw@bogon:~/Desktop$ . case.sh input you name first letter r i don't know you
6.还有break和continue流程控制语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 n=0 while : if [ $n == 3 ] then let n++ continue fi do echo $n let n++ if [ $n == 5 ] then break fi done
结果为:
到这里流程控制就差不多了
八.shell函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #!/bin/sh #建立函数 new_function(){ echo "input one number" read numone echo "input one number again" read numtwo return $(($numone+$numtwo)) } #调用函数 new_function #使用$?来获取函数的返回值 echo "you input two sum is $?"
结果为:
1 2 3 4 5 input one number 1 input one number again 2 you input two sum is 3
2.函数的参数调用
1 2 3 4 5 6 7 8 9 #!/bin/sh new_fontion(){ echo "第一个参数为:$1" echo "第二个参数为:$2" echo "第三个参数为:$3" } new_function 1 4 2
结果为:
九.持续更新中…..
先上两小段代码吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 执行系统命令语法: `系统命令` ip=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'` #ip1=/sbin/ifconfig|sed -n '/inet addr/s/^[^:]*:\\([0-9.]\\{7,15\\}\\) .*/\\1/p' | grep -v 127.0.0.1 while true; do echo "$ip" ipp=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'` echo "$ipp" if [ "$ip" != "$ipp" ]; then `sudo shutdown -h 16:00` else echo "正常" fi sleep 1s done
这段代码主要是监控ip地址是否发生改变,如果IP地址改变则执行关机
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/sh echo "please input you name" read name echo "please input one number:" read numbero echo "please input one number again:" read numbert if [[ x$name == 'x' || x$numbero == 'x' || x$numbert == 'x' ]] then echo "you input has null" elif [[ $numbero -gt $numbert && $name == 'msw' ]] then echo "you input one big" elif [ $numbero -lt $numbert ] then echo "you input two big" else echo "ne" fi
这段代码没什么意思,主要是联系我见天学习的几个命令和判断语法
重难点详解
x$name == ‘x’ 判断输入是否为空,还可以写成
[ -n $name ] :长度不为0则真
[ -z $name ] : 长度为0为真
注意:在[[]]中才可使用&& ||语法,如果是[],和是-a, 或是-o
还有要注意字段间的空格
今天就先到这里吧!