2020.8.31shell脚本

脚本编程Bash Shell
1.每一个shell要有头的定义,正常的是#!/bin/bash
2.打印:echo '要打印的东西'
3.三种调用方式:
定义好的脚本需要加权限 : chmod +x 脚本路径
(1)路径调用:如果在当前目录,则使用./test.sh 
否则:绝对路径/test.sh
(2)普通脚本执行:sh 脚本路径
(3)指定/bin/bash shell 执行:/bin/bash test.sh
注意:./test.sh 相当于
            /bin/bash test.sh
4.变量:
(1)定义变量:
定义变量时,变量名不加美元符号$,变量名和等号之间不能有空格
不能使用标点符号,也不能使用bash里面的关键字
如:a=1
(2)使用变量
使用定义过的变量时,只要在变量名前面增加美元符号即可
如:echo $a
(3)变量名外的当有需要时变量名需要大括号进行区分,以及读值
如 a=1
echo $a
输出的结果为 1
a=1
echo '$a'
输出的结果为 $a
a=1
echo "$a"
输出的结果为 1
(4)只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变
例如:#!/bin/bash
a=1
echo $a
readonly a
a=2
echo $a
输出结果为:
(5)删除变量 unset命令
a=1
echo $a
unsert a
a=2
echo $a
输出结果为:
(6)变量类型:局部变量、环境变量、shell变量
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
(7)单引号和双引号
单引号中任何字符都会原样输出,所以单引号中的变量无意义,无法输出变量的值
双引号里可以有变量
双引号里可以出现转义字符
例如:
#!/bin/bash
a='你好,靓仔'
b='你好,靓仔'
echo $a
echo '$a'
echo "${a}"
输出结果为:
(8)获取字符串长度
#!/bin/bash
a='你好,靓仔'
b='你好,靓仔'
echo ${#a}
输出结果为:5
(9)提取字串
#!/bin/bash
a='你好,靓仔'
b='你好,靓仔'
echo ${a:1:4}
输出结果为:
第一个字符的索引值为0
(10)查找子字符串
#!/bin/bash
a='你好,靓仔'
b='你好,靓仔'
echo `expr index "a" 你 `
输出结果为:0
(11)Shell注释
:%s/^/#/g
还可以
:<<EOF
注释内容
注释内容
EOF
或者
:<<'
注释内容
注释内容
'
或者
:<<!
注释内容
注释内容
!
5.Shell数组
(1)定义数组
数组名=(值1 值2 值3 值4...)
使用@/*符号可以获取数组中的所有元素
例如: 
#!/bin/bash
a=(1 2 3 4)
echo ${a[2]}
echo ${a[@]}
echo ${a[*]}
结果为:3
1 2 3 4
1 2 3 4
(2)获取数组的长度
例如#!/bin/bash
a=(1 2 3 4)
length=${#a[@]}
echo $length
length=${#a[*]}
echo $length
结果为:4
              4
6.传递参数
(1)例如:
#!/bin/bash
echo "Shell 传递参数"
echo "执行文件名:$0"
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "第三个参数为:$3"
为脚本设置可执行权限,并执行脚本
结果为:
(2)参数处理和说明
$#
传递到脚本的参数个数
$*
以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$
脚本运行的当前进程ID号
$!
后台运行的最后一个进程的ID号
$@
与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$-
显示Shell使用的当前选项,与 set命令 功能相同。
$?
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
例如:
#!/bin/bash
echo "Shell 传递参数"
echo "执行文件名:$0"
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "第三个参数为:$3"
echo "传递到脚本的参数个数:$#"
echo "传递的参数作为一个字符串显示:$*"
结果为:
(3)$*与$@异同
同:都是引用所有参数
异: 只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
例如:
#!/bin/bash
echo "演示\$*"
for i in "$*"; do
echo $i
done
echo "演示\$@"
for i in "$@"; do
echo $i
done
结果为:
7.Shell基本运算符
(1)算数运算符
#!/bin/bash
a=`expr 2 + 2`(此时时反引号)
echo "两数之和:$a"
结果为:4
注意:表达式和运算符之间要有空格
          变量名和等号之间不能有空格
运算符
说明
举例
+
加法
`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。
例如:
#!/bin/bash
a=520
b=1314
d=520
c=`expr $a + $b`
echo "a + b : $c"
 
c=`expr $a - $b`
echo "a - b : $c"
 
c=`expr $a \* $b`
echo "a * b : $c"
 
c=`expr $a / $b`
echo "a / b: $c"
 
c=`expr $a % $b`
echo "a % b: $c"
 
if [ $a == $d ]
then
echo "a等于d"
fi
 
if [ $a != $b ]
then
echo "a不等于b"
fi
结果为:
注意:乘号*前面必须添加反斜杠\才能进行乘法运算
(2)关系运算符(只支持数字,不支持字符串,除非字符串的值是数字)
运算符
说明
举例
-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。
例如:
#!/bin/bash
a=1
b=2
c=2
if [ $b -eq $c ]
then
echo "b等于c"
else
echo "b不等于c "
fi
if [ $a -ne $b ]
then
echo "a不等于b"
fi
if [ $a -lt $b ]
then
echo "a小于b"
fi
if [ $c -gt $a ]
then
echo "c大于a"
fi
if [ $c -ge $a ]
then
echo "c大于或等于a"
fi
if [ $b -le $c ]
then
echo "b小于或等于c"
fi
结果为:
(3)布尔运算符和逻辑运算符
运算符
说明
举例
!
非运算,表达式为 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。
优先级:!>-a>-o
运算符
说明
举例
&&
逻辑的 AND
[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||
逻辑的 OR
[[ $a -lt 100 || $b -gt 100 ]] 返回 true
#!/bin/bash
a=1
b=2
c=2
if [ $a -lt $b -a $a -lt $c ]
then
echo "判断为正"
else
echo "判断为错"
fi
 
if [ $a -gt $b -o $a -lt $c ]
then
echo "判断为正"
else
echo "判断为负"
fi
结果为
逻辑运算符同理
(4)字符串运算符
 
运算符
说明
举例
=
检测两个字符串是否相等,相等返回 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。
#!/bin/bash
a='你是神魔恋'
b='憨批'
if [ $a = $b ]
then
echo "$a = $b: a等于b"
else
echo "$a != $b a不等于b"
fi
 
结果为:
 
8.read显示变量
read命令从标准输入中读取一行,并把输入行的每个字段的值指定给shell变量
例如:
#!/bin/bash
read name
echo "$name 是猪"
结果为:
9.换行和不换行
echo "It is my love" > a.txt //将结果定向传文件
echo `date` // 显示命令执行结果
结果为 : Fri Aug 28 17:38:31 CST 2020
10.test命令
test相当于[]
例如:
if [ $a -eq $b ]
相当于
if test $a -eq $b
11.Shell 流程控制
(1)
if condition
then
        command1
        command2
        ....
fi
还可以写成一行,例如:
#!/bin/bash
a=1
b=2
if test $a -lt $b ; then echo "true";fi
(2)if else-if else语法格式
if condition1
then
    command1
elif conditon2
then
    command2
else
    command3
fi
例如:
#!/bin/bash
a=1
b=2
c=3
if test $a -gt $b ; then echo "true";
elif test $b -lt $a ;then echo "true";
else
echo "false";
fi
(3)for循环(基本等同于java)
for var in item1 item2 .. itemN
do
    comand1
    comand2
    ...
    comandN
done
例如:
#!/bin/bash
for (( a=1 ;a <= 10 ; a++ ))
do
echo $a
done
结果为:
(4)while语句
while ((condition))
do 
command
done
例如:
#!/bin/bash
a=1
while(( $a <= 10 ))
do
echo $a
let "a++"
done
也可以这样
#!/bin/bash
a=1
while test  $a -lt 10
do
echo $a
let "a++"
done
 
结果为:
(5)until循环
condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
until condition
do
        command
done
例如:
#!/bin/bash
a=1
until test ! $a -lt 10
do
echo $a
let a++
done
结果为:
(6)case语句
case 值 in
模式1)
    command1
    command2
    ...
    commandN
;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
例如:
#!/bin/bash
echo "请输入1到3之间的数字"
echo "你输入的数字为"
read a
case $a in
1)echo "你选择了1"
;;
2)echo "你选择了2"
;;
3)echo "你选择了3"
;;
*)echo "你没有输入1到3之间的数字"
;;
esac
结果为:
还可以配合break语句,可以跳出循环
#!/bin/bash
while :
do
echo "请输入1到3之间的数字"
echo "你输入的数字为"
read a
case $a in
1)echo "你选择了1"
;;
2)echo "你选择了2"
;;
3)echo "你选择了3"
;;
*)echo "你没有输入1到3之间的数字"
break
;;
esac
done
例如:
还有continue,跳过这段输出
(7)TMOUT
TMOUT变量用于设置Shell的过期时间,当TMOUT不为0时,Shell在TMOUT秒后将自动注销
例如:
-z 判断字符串是否为空
#!/bin/bash
TMOUT=6
echo -n "what's your name?"
read name
if test -z $name
then
echo "没有输入"
else
echo "你的名字是$name"
fi
结果为:
 
12.Shell 函数
(1)[function] 函数名(){函数体;}        可以有return语句,但只能return数值类型,不能返回字符串
#!/bin/bash
fun(){
具体内容
}
fun //调用函数
(2)$?仅对上一条指令负责,一旦函数返回后其返回值没有立刻保存到参数,那么它的返回值将不能再通过$?获得
例如:
#!/bin/bash
fu(){
return `expr 1 + 1`
 
}
fu
echo $?
echo $?
结果是 2
            0
如果不调用函数,则结果都为 0 0
2.参数的传递:函数内部的参数列表只取决于调用函数时的参数列表,与脚本的参数无直接影响
 
补充:
1.变量的定义
(1)直接赋值发: a=1 b="abc" arr=(1 2 3 4)
(2)引用赋值法: b=$a c=${b}
                               c=a
                               ${!c}
(3)引用变量的运算:
b=`expr $a + 1`
b=$(( $a + 1 ))
b=$[ $a + 1 ]
2.在判断条件中使用计算:在红括号内侧及运算符两边都加空格
3.数值型:大于:-gt, 小于:-lt,等于-eq或==,不等于-ne
4.字符串型:等于:=或== 不等于:!=,是否为空 -z 字符串
5.if条件语句可省略成 [[条件语句]] && 结果语句
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值