直接指令下达:shell.sh文件必须具备rx权限才可以:
以bash程序来执行,通过"bash shell.sh"或者"sh shell.sh"来执行
利用source来执行脚本
前两种方式执行时,系统会给与一支新的bash让我们来执行shell脚本,当脚本执行完毕后,子程序bash内的所有数据便会被移除。
利用source来执行时,是在父程序中执行,在执行完脚本后,各项动作都会在原本的bash内生效
your_name="linux"
echo $your_name
echo ${your_name}
#变量名外面的花括号是可选的,一般都会加上,便于识别变量的边界
#若不给skill加花括号,则解释器会把skillScript当成一个变量
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
注意是花括号!
注意是花括号!
注意是花括号!
$#:代表后面接的参数格式,以上图为例显示为"4"
$@:代表"$1""$2""$3""$4"之意
$ * 代表"$1 $2 $3 $4"之意
#$*与$@的区别:
#$*是一个字符串,$@是三个单独的变量
for i in "$*"; do
echo $i
done
for i in "$@"; do
echo $i
done
=========输出结果=========
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
a=5; b=7; c=2$
echo $(( a+b*c ))《==写成echo $((${a}+${b}*${c}))也可以
19
echo $(( (a+b)/c ))
6
echo $(( (a*b)%c))
1
str=‘this is a string’
str=“this is a string”
单引号与双引号的区别:
双引号中可以保留特俗字符的特性,可以有变量,单引号中的都是一般文本字符
#获取字符串长度
string="abcd"
echo ${#string}
#提取子字符串
string="Linux is a great system"
echo ${string:1:4}《==输出inux,从字符串第2个字符开始截取4个字符
bash支持一维数组(不支持多维数组),并且没有限定数组的大小
#数组的定义
数组名=(值1 值2 值3 ... 值n)
#例子,三种方式定义数组
array_name=(value0 value1 value2 value3)
array_name=(value0
value1
value2
value3)
array_name[0]=value0
array_name[1]=value1
#读取数组
${数组名[下标]}
#使用@符号可以获取数组中的所有元素
echo ${arrary_name[@]}
#获取数组的长度
length=${#array_name[@]}
#获取数组单个元素的长度
lengthn=${#array_name[n]}
#类型判断
test -e filename <==判断该文件名是否存在
test -f filename <==判断给文件名是否是文件
test -d filename <==判断该文件名是否为目录
#判断字符串数据
test -z string <==判断字符是否为0?若string为空字符串,则为true
test str1 == str2 <==判断str1是否等于str2
test str1 != str2 <==判断str1是否不等于str2
[ data1 op data2 ]
在中括号[]内的每个元件都需要有空白键来分割
在中括号内的变量,最好都以双引号括号起来
在中括号内的常数,最好都以单或双引号括号起来
[ vrid tsai == "vbird" ](false,这里有vrid,tsai和"vbird"三个数据)
[ "vrid tsai" == "vbird" ](true)
#条件判断(if..elif..elif..else)
if [ 条件判断式1 ]; then
程序段一
elif [ 条件判断式2 ]; then
程序段二
elif [ 条件判断式3 ]; then
程序段三
else
程序段四
fi
case ${变量名称} in <==关键字为case,还有变量前有$
"第一个变量内容")<==每个变量内容建议用双引号括起来,关键字则为右小括号
程序段一
; ; <==每个类别结尾使用两个连续的分号来处理
"第二个变量内容")
程序段二
; ;
*) <==最后一个变量内容都会用*来代表其他值
程序段三
; ;
esac <==最后的case结尾!“反过来写”思考一下
#while循环
while [ 条件表达式 ]
do <==do是循环的开始!
程序段
done <==done是循环的结束
#until循环
until [ 条件表达式 ]
do <==do是循环的开始!
程序段
done <==done是循环的结束
两者的区别:until循环执行一系列命令直到条件为true时停止。until循环与while循环在处理方式上刚好相反。
#第一种写法
for var in con1 con2 con3...
do
程序段
done
#第一次循环时,$var的内容为con1
#第二次循环时,$var的内容为con2
#第三次循环时,$var的内容为con3
#...
#第二种写法,这种写法适合于数值方式的运算当中
for ( ( 初始值;限制值;执行步阶) )
do
程序段
done
#初始值:某个变量在循环当中的额起始值,直接以类似i=1设置好
#限制值:当变量的值在这个限制值的范围内,就继续进行循环,例如i<=100
#执行步阶:每作一次循环时,变量的变化量。例如i=i+1
break命令运行跳出所有循环;continue表示直接进行下一次循环;两个命令和编程中的用法一样。
#函数定义
[function] fname(){
程序段(外部变量使用$(1),$(2),$(3),.....表示传入的第几个参数)
}
#函数使用
fname [var1] [var2] ....<==var1,var2表示传入的参数
特别注意:因为shell script的执行方式是由上而下,由左而右,因此在shell脚本当中的function的设置一定要在程序的最前面
sh [-nvx] scripts.sh
选项与参数:
-n:不要执行script,仅查询语法的问题
-v:再执行script前,先将scripts的内容输出到屏幕上;
-x:将使用到的script内容显示到屏幕上,这是很有用的参数!
3.当执行一个程序的时候,这个程序会让使用者选择boy或者girl;如果使用者输入B或者b时,就显示:He is a boy;如果使用者输入G或者g时,就显示:He is a girl;如果是除了B/b/G/g以外的其他字符,就显示:I don’t know。
注意if与中括号之间有一个空格