赞
踩
./xxx.sh (要有执行权限)sh xxx.shsh 绝对路径sh 命令执行不要求x权限可以目录文件夹下输入命令 ll
没有权限可执行 chmod u+x 文件名.sh
给所有用户添加执行权限: chmod a+x 文件名.sh
注意查看是否有文件执行权限,有权限会显示绿色。
ariable="abc"echo $variable #可缺省
echo ${variable}
echo "I am good at ${skill}Script"
#如果使用的是skill变量则大括号不可缺省,缺省时解释器会使用skillScript变量
url="www.google.com"
readonly url
url="www.baidu.com" #赋值失败
shell脚本与其他脚本语言的优势在于环境兼容性强,劣势在于不适合复杂度较高,要进行数据结构比较复杂的操作时最好使用其它复杂脚本语言(如python),然后使用shell进行调用即可
name="bob"
echo "hello,$name!" #hello,bob!
echo "hello,"$name"!" #hello,bob!
echo 'hello,$name!' #hello,$name!
echo 'hello,'$name'!' #hello,bob!
a=10
b=-5
echo `expr $a + $b` #5
array=(value0 value1 value2) echo ${array} #不指定下标时直接读取第0个元素的值 echo ${array[0]} #读取数组的第0个元素的值(这种情况大括号无法省略,否则或读取$array变量) echo ${array[@]} #使用@符号获取数组中所有元素 array[0]=5 #修改第0个元素的值 # 使用#获取数组或字符串变量的长度,但是不能获取常量的长度 str="string" array=(1 "abcdefg" -8) echo ${#str} #6 echo ${#"string"} #报错 “string”是字面值&常量 echo ${#array[@]} #3 返回数组长度3 echo ${#array[1]} #7 echo ${#array[2]} #2(-8仍然被当作"-8"字符串处理)
使用expr, 命令多元运算符的两边必须有 空格
value=expr 2 + 2
算术运算符: +、-、*、/、%
乘号*前边必须加反斜杠()转义才能实现乘法运算
关系运算符 关系运算符仅适用于数字,其中=和!=不仅适用于数字也适用于字符串的比较
-eq(=) equal 判断是否相等
-ne(!=) not equal 判断是否不等
-gt(>) greater than 判断是否大于
-ge(>=) greater equal 判断是否大于等于
-lt(<) less than 判断是否小于
-le(<=) less equal 判断是否小于等于
逻辑运算符 , 仅适用于运算符两边均是布尔值的运算
! 非运算
-o(||) 或运算 or
-a(&&) 与运算 and
字符串运算符
= 判断是否相等
!=判断是否不等
-z zero 判断字符串长度是否为0
-n not zero 判断字符串长度是否不为0
$ 判断字符串是否不为空,即该变量是否存在,存在时返回true
文件检测运算符
文件检测运算符适用于检测Unix文件的各种属性,作为路径字符串的单元操作符
-b block 判断路径是否是块设备文件
-c char 判断路径是否是字符设备文件
-d directory 判断路径是否是目录路径(即文件夹)
-e exist 判断路径是否存在(即该路径对应一个文件或者目录)
-f file 判断路径是否是文件路径(既不是目录也不是设备文件)
-r read 判断文件是否可读
-w write 判断文件是否可写
-x exec 判断文件是否可执行
-s 判断文件是否不为空(文件大小是否大于0)
if condition1
# condition语句一般使用 中括号[] ,包含返回布尔值的运算符的运算语句
# 如 [ a == b ],且变量名与中括号之间必须有 空格
then
command1
command2
commandN
elif condition2;then #用;可以代替换行
command3
else
command4
#elif分支或else分支没有任何指令执行,则不能写这个分支,否则解释器会报错
fi
for var in item1 item2 ${array[@]} item3 itemN
do
command1
command2
done
while/until循环
condition是终止条件且循环体至少执行一次
while/until condition
do
command1
command2
done
break和continue
和其它语言一样,break命令跳出循环体执行后面的语句,continue跳出本次循环而不影响后面循环的执行
xxx in形式的选择语句,类似于其它语言的switch case语句case $value in
"value1")
echo "case1"
;;
"value2")
echo "case2"
;;
*)
echo "case default"
;;
esac
a=1
# 函数声明: 其中`function`和`()`二者可以缺省一个,`()`和`{}`之间的空格也可以缺省
function funcName() {
echo $1
echo $a
b=2
return 3
}
# 函数调用 函数名后面是空格分开的参数列
funcName "param1" param2 # param1 1
# 在函数调用完成后通过$?获取 return语句返回的数值(0-255)
echo $? #3
echo $b #2
# 多行注释
:<<EOF
a = 1
EOF
shell强大之处在于可以调用所有环境变量Path中的程序
#!是shell文件开始部分一个约定的标记(和python声明文件编码类似),它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell, 如:#!/bin/bash即声明该shell脚本使用bash解释执行
参数处理
在执行shell脚本时,通常需要向脚本传递参数,在脚本内通过 $n 获取参数,n代表参数的位置从1开始,
因为无法以纯数字作为变量名所以并不会冲突,但是超过10后必须使用 ${n} 获取避免歧义。
下面还有一些特殊字符处理参数
$# 参数总个数$* 以单字符串返回脚本传递的所有参数(一般用于log)$@ 返回每个参数构成的数组(一般用于遍历)$- 显示shell当前使用的选项,和set命令对应$? 返回上一条命令(包括函数调用)的退出状态 0表示正常返回文件引入 . 或 source 进行引入,是类似include的概念,当解释器识别到文件包含指令时,会将对应文件中的文本替换到包含指令中再进行执行。
. fileName1 #包含fileName1文件
source fileName2 #包含fileName2文件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。