helloWord 1 2 3 4 5 6 7 #!/bin/bash echo 'helloword' # 注释 # 1.#! 选择编译脚本的shell程序 # 2./bin/bash (Bourne Again Shell)免费易用的编译shell程序,被广泛使用 # 3.echo 向窗口输出文本信息 # 4.sh helloword.sh 执行程序
变量与参数 变量
变量和等号之间不能有空格
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头,可以包含下划线(_),不能包含bash关键字
通过($)获取变量1 2 3 4 5 6 7 8 9 10 11 12 # 变量 var='变量' echo $var echo ${var} # 只读变量 readonly readonly_var='只读变量' readonly readonly_var echo ${readonly_var} # 删除变量 unset delete_var='删除变量' unset delete_var echo ${delete_var}
数组 shell中数组支持一维数组,没有数组大小限制1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 创建 arr=(A B C D) # 打印 输出:A echo ${arr[0]} # 赋值 输出:a arr[0]='a' echo ${arr[0]} arr[4]='F' # 全部输出 输出:a B C D F echo ${arr[*]} # 数组长度 输出:5 echo ${#arr[*]} # 数组元素长度 输出:1 echo ${#arr[0]}
参数
$0,$1..$n* 向脚本传递参数
$* #:传递的参数个数
$** :传递的参数以字符串拼接输出1 2 3 4 echo "外部传入第一个的参数: $1" [root@iZwz93bgrt56kof7dpvta7Z testshell]# sh helloword.sh 哈哈 外部传入第一个的参数: 哈哈
字符处理 字符串可以单引号也可以双引号也可以不用引号单引号 :其中不能包含变量,不能包含单引号双引号 :可以包含变量和转义字符
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 # 字符串 var="a" str="this is \"${var}\" !" # str="this is ${var} !" # str="this is "${var}" !" # 输出:this is "a" ! echo $str # 1.字符长度 输出:13 echo ${#str} # 2.字符截取 从左开始0到4个字符 输出:this echo ${str:0:4} # 3.从左截取 # 输出:is "a" ! echo ${str#*is} # 输出:"a" ! echo ${str##*is} # 4.从右截取 # 输出:this echo ${str%is*} # 输出:th echo ${str%%is*} # 5.从左边第几个开始 输出:is "a" ! echo ${str:4} # 6.从右边第几个开始,向右输出多少个 输出:"a" echo ${str:0-5:3} # 7.从右边第几个开始,一直到最后 输出:"a" !
流程控制(if,for,while) if 1 2 3 4 5 6 7 8 9 if condition then command1 command2 ... commandN fi # 其他写法 if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
1 2 3 4 5 6 7 8 9 if condition then command1 command2 ... commandN else command fi
1 2 3 4 5 6 7 8 9 if condition1 then command1 elif condition2 then command2 else commandN fi
for 1 2 3 4 5 6 7 for var in item1 item2 ... itemN do command1 command2 ... commandN done
while 1 2 3 4 5 6 7 while condition do command done # 其他写法 for var in item1 item2 ... itemN; do command1; command2… done;
demo 递归遍历Linux文件目录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 递归遍历Linux文件目录 #! /bin/bash parm=$1 function read_file(){ # echo "inport parmater $1" for file in `ls $1` do # echo "this is file name $file" if [ -d $1"/"$file ] then read_file $1"/"$file else echo "this is file"$1"/"$file fi done } # echo "this is start file $parm" read_file $parm
复制图片到指定目录 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 28 29 30 31 32 # 复制图片到指定目录 #!/bin/bash echo "batch copy..." # 获取参数位置为第二个和第三个 curpath=$1 topath=$2 # if语句 -z 字符运算判空 if [ -z $curpath ]; then echo "Please enter as param 1" exit fi if [ -z $topath ]; then echo "Please enter webapps PATH as param 2" exit fi # for循环 传入路径下以.JPG后缀的文件 for file in $curpath/*.JPG do # 字符操作构造目标文件地址 # echo ${file} var=${file} # echo ${var##*/} picname=${var##*/} # echo ${picname:0:8} monthprefix=${picname:0:8} # echo ${picname:0:10} dayprefix=${picname:0:10} path=$topath/$monthprefix/$dayprefix/ # echo $path # 复制 -u 更新性复制,没有才复制 -v 输出复制结果 cp -u -v ${file} $path done
运算 bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用 expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
算术运算 例如:a=10,b=20 加法 | expr $a + $b
结果为 30。 | 减法 | expr $a - $b
结果为 -10。 | 乘法 | expr $a \* $b
结果为 200。 | 除法 | expr $b / $a
结果为 2。 | 取余 | expr $b % $a
结果为 0。 | 赋值 | a=$b 将把变量 b 的值赋给 a。 | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ]
返回 false。 | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ]
返回 true。 |
注意 :条件表达式要放在方括号之间,并且要有空格,例如:[$a==$b] 是错误的,必须写成 [ $a == $b ] 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a=10 b=20 num=`expr $a + $b` echo "加法:" $num echo "减法:"`expr $a - $b` echo "乘法:"`expr $a \* $b` echo "除法:"`expr $a / $b` echo "求余:"`expr $a % $b` [root@iZwz93bgrt56kof7dpvta7Z testshell]# sh helloword.sh 加法: 30 减法:-10 乘法:200 除法:0 求余:10
关系运算 例如:a=10,b=20 | -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。 |
布尔运算 | ! | 非运算,表达式为 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。 |
逻辑运算 | && | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]]
返回 false | | || | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]]
返回 true |
字符运算 a=’abd’ b=’efg’ | = | 检测两个字符串是否相等,相等返回 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。 |
文件运算 | -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。 |