Shell学习笔记二

变量
shell变量定义的严格语法限制:
1. 变量名和等号之间不能有空格。
2. 变量名收个字符必须为英文父母。
3. 不能包含标点符号但能够使用下划线"_"。
4. 不能使用空格。
5. 不能使用bash里的关键字。

引用变量
对于定义过的变量只要在变量名之前加一个$即可。

重新定义变量
已经定义的变量,可以被重新定义。
荔汁

name="rookiezhao"
echo=${name}
name="rookie"
echo${name}

只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变
荔汁

name="rookiezhao"
readonly name
name="tiechui"

参数传递
在执行shell脚本时,可以向脚本传递参数。脚本内获取参数的格式为:$n。n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,一次类推…

  1. 修改helloworld.sh为
#!/bin/bash
echo $1
echo $2
echo $3
  1. 执行携带参数
[rookiezhoa@dev64]./helloworld.sh haha wowow nini
haha
wowo
nini

特殊字符

字符意义
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

$ @ 区 别 : 相 同 点 : 都 表 示 传 递 给 脚 本 的 所 有 参 数 。 不 同 点 : 不 被 " " 包 含 时 , " @区别: 相同点:都表示传递给脚本的所有参数。 不同点:不被 " " 包含时, " @""""会将所有的参数作为一个整体,以" $1 $2 … $n"的形式组成一个整串;"$@“会将各个参数分开,以”$1" " 2 " . . . " 2" ... " 2"..."n"的形式组成一个参数列表。

shell字符串

单引号
name=‘my name is rookiezhao’
1. 单引号字符串不支持引用变量,任何字符都会原样输出
2. 单引号字符串中不能出现单引号(对单引号使用转移符后也不行)

双引号
name=‘my name is rookiezhao’
name_again=""$[name}""
1. 双引号里可以引有变量
2. 双引号里支持转义字符

字符串长度
name=‘my name is rookiezhao’
echo ${#name}

截取字符串
name=‘my name is rookiezhao’
echo ${name❌y}//执行输出rookiezhao
这里的x,y代表从name字符串中的第x+1个字符串开始,向后y个字符。

shell数组

bash支持一位数组(不支持多维数组),并且没有限定数组的大小。在shell中,用括号来表示数组,数组袁术用"空格"符号分隔开。定义数组的一般形式为:
array_name=(value1 … valuen)

//第一个数组
rookiezhao@Dev_t64:~$usernames=(1 2 33 444 rookiezhao)
//默认读取第一个
rookiezhao@Dev_t64:~$echo ${usernames} 
1
//读取下标为0的
rookiezhao@Dev_t64:~$echo ${usernames[0]}
1
//读取下表为1的
rookiezhao@Dev_t64:~$echo ${usernames[1]}
2

//读取所有
rookiezhao@Dev_t64:~$echo ${usernames[@]}
1 2 33 444 rookiezhao
rookiezhao@Dev_t64:~$echo ${usernames[*]}
1 2 33 444 rookiezhao
//获取数组长度
rookiezhao@Dev_t64:~$echo ${#usernames[@]}
1 2 33 444 rookiezhao
rookiezhao@Dev_t64:~$echo ${#usernames[*]}
1 2 33 444 rookiezhao

shell运算符

支持包括:算数、关系、布尔、字符串等运算符。
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。expr是一款表达式计算工具,使用它能完成表达式的求值操作。

荔汁
#!/bin/bash
a=10
b=20
val=$(expr $a + $b) //$a 与 + 与 $b之间应该有两个空格
echo "a+b:$val"

val=$(expr $a - $b) //$a 与 - 与$b之间应该有两个空格
echo "a-b:$val"

val=$(expr $a \* $b) //转义*
echo "a*b:$val"

val=$(expr $b / $a)
echo "b/a:$val)

val=$(expr $b % $a)
echo "b%a:$val"

if [ $a == $b ] //if 与 [ 与 $a 与 == 与 $b 与 ] 之间应该有5个空格每个“与”是一个空格。
then
	echo "a==b"
fi

if [ $a != $b ]
then
	echo "a!=b"
fi

输出

rookiezhao@Dev_t64:~$./calculation.sh 
a+b:30
a-b:-10
a*b:200
b/a:2
b%a:0
a!=b

注意

  1. 乘号*前面必须加反斜杠\
  2. 条件表达式要放在方括号之间,并且要有空格

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

运算符意义
-eqEQUAL等于
-neNOT EQUAL不等于
-gtGREATER THAN 大于
-ltLESS THAN 小于
-geGREATER THAN EQUAL 大于等于
-leLESS THAN OR EQUAL 小于等于

布尔运算符

运算符意义
&&
荔汁
#!bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]] //[[之间是没有空格的。
then 
	echo "true"
else
	echo "false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then 
	echo "true"
else
	echo "false"
fi

执行

rookiezhao@Dev_t64:~/testofshell$./booloperator.sh 
false
true

字符串运算符

操作符意义
-z字符串长度是否为0,为0返回true
-n字符串长度是否为0,不为0返回true
str字符串是否为空,不为空返回true

文件测试运算符

操作符意义
-b file文件是否是块设备文件,如果是,则返回true
-c file文件是否是字符设备文件,如果是,则返回true
-d file文件是否为目录文件,如果是,则返回true
-f file文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true
-g file文件是否设置了SGID位,如果是,则返回true
-k file文件是否设置了粘着位(Sticky Bit),如果是,则返回true
-p file文件是否是有名管管道,如果是,则返回true
-u file文件是否设置了SUID位,如果是,则返回true
-r file文件是否可读,如果是,则返回true
-w file文件是否科协,如果是,则返回true
-x file文件是否可执行,如果是,则返回true
-s file文件是否为空(文件大小是否大于0),不为空返回true
-e file文件(包括目录)是否存在,如果是,则返回true
荔汁
#!/bin/bash
file="/com/rookiezhao"
if [ -r $file ]
then
	echo "can read"
else
	echo "can not read"
fi

if [ -w $file ]
then 
	echo "can write"
else
	echo "can not write"
fi

if [ -x $file ]
then 
	echo "can run"
else
	echo "can not run"
fi

if [ -f $file ]
then 
	echo "common file"
else
	echo "no common file"
fi

if [-s $file ]
then 
	echo "no empty file"
else
	echo "empty file"
fi

if [ -e $file ]
then 
	echo "exist file"
else
	echo "no exist"
fi

流程控制

1. if-else

    if condition
    then 
    	//do 
    else
    fi
    
    if condition1
    then
    	//do things
    elif condition2
    then
    	//do things
    else
    	//do things
    fi

2. case
case语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令

case 值 in
模式1)
	//do things
	;;
模式2)
	//do things
	;;
*)
	//do things
	;;
	esac

取值后面必须为关键字in,每一模式必须以又括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。;;与其他语言中的break类似,意思是调到整个case语句的最后。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用型号*捕获该值,再执行后面的命令。
3. for
for 变量 in 列表

do
	//do things
done

4.while

while command
do
	//do things
done

5. until

until 循环执行一系列命令直至条件为true时停止。until循环与while循环在处理方式上刚好相反。一般while循环优先于until循环,但在某些时候,也只是极少数情况下,unitl循环更加有用。

until command
do
	//do things
done

command一般为条件表达式,如果返回值为false,则继续执行循环体内的语句,否则跳出循环。

函数

功能:函数可以让我们讲一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,shell也支持函数。shell函数必须先定义后使用。

#!/bin/bash
demoFun(){
	echo "this is a shell fun()"
}
echo " start demoFun"
demoFun
echo "end demoFun"

执行

[rookiezhao@dev_t64~]./demoFun.sh
start demoFun
this is a shell fun()
end demoFun

参考:
(https://blog.csdn.net/weixin_37490221/article/details/80869792)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值