本文主要是介绍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条件语句可省略成 [[条件语句]] && 结果语句
这篇关于2020.8.31shell脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!