shell

1.变量

1.变量类型

运行shell时,会同时存在3种变量:

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
# !/bin/bash
# 定义变量
a="test"
echo ${a}

# 循环
for i in 1 2 3 4;do
	echo 'i = ${i};'
done

# 只读变量
read_test="abcde"
readonly read_test
read_test="efg"		# 错误只读变量不能被改变

# 删除变量
unset read_test		# 错误只读变量不能删除
2.shell字符串

单引号、双引号区别

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

字符串长度

string = "abcde"
echo ${#string}		# 字符串长度
echo ${string:1:4}	# 字符串第1-4个元素
3.数组
array_test=(a b c d e f)
# 改变数组的值
array_test[0]=b

# 查看所有元素
echo ${array_test[@]}
# 数组长度
echo ${#array_test[@]}	# 或 ${#array_test[*]}
# 单个元素长度
echo ${#array_test[1]}

# 遍历数组元素
for i in $array_test;do
	echo $i
done
4.注释
# 多行注释
:<<EOF
注释内容...
...
EFO

:<<'
注释内容...
...
'

:<<!
注释内容...
...
!

2.shell传递参数

#!/bin/sh
echo "当前文件名称:$0";
echo "第一个参数为:$1";

echo "参数个数:$#";
echo "字符串输出传递的所有参数:$*"
echo "输出传递的所有参数:$@"

echo "--\$*和\$@区别--"
for i in "$*";do
        echo "\$*循环参数,$i"
done

for i in "$@";do
        echo "\$@循环参数,$i"
done

$ ./test.sh 1 2 3

当前文件名称:./test2.sh
第一个参数为:1
参数个数:3
字符串输出传递的所有参数:1 2 3
输出传递的所有参数:1 2 3
--$*$@区别--
$*循环参数,1 2 3
$@循环参数,1
$@循环参数,2
$@循环参数,3
1.*与@ 区别:
  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@ ∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。如" 使"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

3.shell数组

#!/bin/bash
my_array=(a b c d e f g)
echo "读取数组第$1 个元素,值为:${my_array[$1]}"

$ ./array.sh 1
读取数组第1 个元素,值为:b

4.shell运算符

1.算数运算符
#!/bin/bash
:<<!
expr 算数运算符测试!
。。。
!
# 加法
val=`expr $1 + $2`
echo "$1 + $2 = $val"

# 减法
val=`expr $1 - $2`
echo "$1 - $2 = $val"

# 乘法(需要转义符\)
val=`expr $1 \* $2`
echo "$1 * $2 = $val"

# 除法
val=`expr $1 / $2`
echo "$1 / $2 = $val"

# 取余
val=`expr $1 % $2`
echo "$1 % $2 = $val"

# 赋值
a=$2
echo "$a = $2"

# 相等(表达式写在中括号中间,左右有空格)
if [ $a == $2 ]
then
    echo "$a == $2"
fi

# 不等
if [ $a != $2 ]
then
    echo "$a != $2"
fi

$ ./expr.sh 1 2
1 + 2 = 3
1 - 2 = -1
1 * 2 = 2
1 / 2 = 0
1 % 2 = 1
2 = 2
2 == 2
2.关系运算符
#!/bin/bash
:<<!
多行注释!
!

a=10
b=20
# 等于 eq
if [ $a -eq $b ]
then
    echo "$a -ep $b, a等于b"
else
    echo "$a -ep $b,a不等于b "
fi

# 不等于 ne
if [ $a -ne $b ]
then
    echo "$a -ne $b,a不等于b"
else
    echo "$a -ne $b,a等于b"
fi

# 大于 gt
if [ $a -gt $b ]
then
    echo "$a -gt $b,a大于b"
else
    echo "$a -gt $b,a不大于b"
fi

# 小于 lt
if [ $a -lt $b ]
then
    echo "$a -lt $b,a小于b"
else
    echo "$a -lt $b,a不大于b"
fi

# 大于等于 ge
if [ $a -ge $b ]
then
    echo "$a -ge $b,a大于等于b"
else
    echo "$a -ge $b,a小于b"
fi

# 小于等于 le
if [ $a -le $b ]
then
    echo "$a -le $b,a小于等于b"
else
    echo "$a -le $b,a大于b"
fi


$ ./orand.sh
10 -ep 20,a不等于b 
10 -ne 20,a不等于b
10 -gt 20,a不大于b
10 -lt 20,a小于b
10 -ge 20,a小于b
10 -le 20,a小于等于b
3.布尔运算符
#!/bin/bash
:<<!
布尔运算符
!
a=1
b=2
c=3

# 与 -a
d="$b 大于 $a and $c 大于 $a"
if [ $b -gt $a -a $c -gt $a ]
then
	echo "$d True"
else
	echo "$d False"
fi

# 或 -o
d="$b 大于 $a$c 大于 $a"
if [ $b -gt $a -o $c -gt $a ]
then
	echo "$d True"
else
	echo "$d False"
fi


# 非 !
d="$a 不等于 $b"
if [ $a != $b ]
then
	echo "$d True"
else
	echo "$d False"
fi

$ ./bool.sh
2 大于 1 and 3 大于 1 True
2 大于 13 大于 1 True
1 不等于 2 True
4.逻辑运算符
运算符说明举例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||逻辑的 OR[[ $a -lt 100 || $b -gt 100 ]] 返回 true
5.字符串运算符
运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否不相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否不为 0,不为 0 返回 true。[ -n “$a” ] 返回 true。
$检测字符串是否为空,不为空返回 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。

其他检查符:

  • -S: 判断某文件是否 socket。
  • -L: 检测文件是否存在并且是一个符号链接。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值