概述
Shell脚本
- 第一个Shell程序
- 运行shell脚本的方式
- shell变量
- 变量类型
- 命名规则
- 使用shell变量
- 字符串变量
- 数组
- 定义数组
- 传递参数
- 获取参数值
- 运算符
- 算数运算符
- 关系运算符
- 布尔运算符
- 逻辑运算符
- 字符串运算符
- 文件测试运算符
- echo命令
- 显示普通字符串
- 显示转义字符串
- 显示变量
- 显示换行
- 显示不换行
- 显示结果定向至文件
- 原样输出字符串,不进行转义或取变量
- 显示命令执行结果
- 流程控制
- if-else
- for循环
- while循环
- case选择语句
第一个Shell程序
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个test.sh文件,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,主要是为了见名知意,如果你用 java写 shell 脚本,扩展名就用 .java就好了
shell脚本第一行一般是固定的:
#!/bin/bash
代码如下:
#!/bin/bash
echo "Hello world!"
运行结果:
运行shell脚本的方式
修改程序的可执行权限
chmod a+x [shell脚本文件名] #修改文件的可执行权限
./[shell脚本文件名] #执行shell脚本
直接运行
sh [shell脚本文件名]
shell变量
变量类型
- 局部变量
局部变量在脚本中或者命令中定义,仅在当前Shell实例中有效,其他Shell启动的程序不能访问局部变量
- 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行
- Shell变量
shell变量是由shell程序设置的特殊变量
命名规则
1.变量名和等号之间不能有空格
2.命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
3.中间不能有空格,可以使用下划线(_)
4.不能使用标点符号
5.不能使用bash里的关键字
使用shell变量
- 创建普通变量
name="hello" #("="两边不可以有空格)
- 创建只可以在函数体中使用的变量
local name="test"
#(使用local修饰的变量在函数体外无法访问,只能在函数体内使用)
- 使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
echo $name
- 变量重新赋值
name="new_name"
- 只读变量
#!/bin/bash
myurl="http://www.baidu.com"
readonly myurl
myurl="http://www.sogou.com"
- 删除变量
unset [变量名]
#(删除之后不可访问,删除不掉只读变量)
字符串变量
- 单引号
(1)单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
(2)单引号中不能出现一个单独的单引号,转义也不可以
- 双引号
(1)双引号里可以有变量
(2)双引号里可以出现转义字符
- 拼接字符串
(1)中间没有+之类的字符
(2)使用单引号或者双引号进行拼接
- 获取字符串长度
在${}中使用“#”获取长度
name="xyf"
echo ${#name}
- 提取子字符串
1:4 从第2个开始 往后截取4个字符
::4 从第一个开始 往后截取4个字符
str="This is xyf"
echo ${name:1:4} #输出his
echo ${name::4} #输出This
数组
定义数组
数组名=(值1 值2 … 值n)
(小括号做边界、使用空格分离)
array_name=(value0 value1 value2 value3)
- 单独定义数组中的元素
array_name[0]="a"
array_name[1]="b"
array_name[n]="z"
#定义的时候数组下标可以不连续
- 获取数组元素
#!/bin/bash
array[0]="xyf"
array[1]="zss"
array[3]="couple"
echo ${array[0]}
echo ${array[@]}
- 取得元素个数
echo ${#array[@]} 或者 echo ${#array[*]}
传递参数
获取参数值
- $0:固定,代表执行的文件名
- $1:代表传入的第1个参数
- $n:代表传入的第n个参数
- $#:参数的个数
- $*:以一个字符串显示脚本传递的参数
- $@:与$*相同,但是使用时加引号,并在引号中返回每个参数
- $$:脚本当前运行的进程号
- $!:后台运行的最后一个进程号
- $-:显示Shell使用的当前选项
- $?:显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
#!/bin/bash
echo "Shell 传递的参数!"
echo "执行的文件名: $0"
echo "传入的第1个参数:$1"
echo "传入的第2个参数:$2"
echo "传入的第3个参数:$3"
echo "传入的参数个数:$#"
echo "脚本当前运行的进程号:$$"
echo "后台运行的最后一个进程号:$!"
$@和$*
相同点:都是引用所有参数
区别:只有在双引号中体现出来。
假设在脚本运行时写了三个参数 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
运算符
算数运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 运行结果为30 |
- | 减法 | expr $a - $b 运行结果为-10 |
* | 乘法 | expr $a * $b 运行结果为200 |
/ | 除法 | expr $a / $b 运行结果为0 |
% | 取余 | expr $a % $b 运行结果为10 |
= | 赋值运算符 | a=$b 将b的值赋值给a |
== | 用于比较两个两个数字是否相同 | [ $a == $b ] 返回false |
!= | 用于比较两个数字是否不相同 | [ $a != $b ] 返回true |
注意:条件表达式要放在方括号内,并且要有空格
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a+b:$val"
val=`expr $a - $b`
echo "a-b:$val"
val=`expr $a * $b`
echo "a*b:$val"
val=`expr $a / $b`
echo "a➗b:$val"
val=`expr $a % $b`
echo "a%b:$val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
运行结果:
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
关系运算符 | 说明 | 举例 |
---|---|---|
-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=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b:a等于b"
else
echo "$a -eq $b:a不等于b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b:a不等于b"
else
echo "$a -ne $b:a等于b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b:a大于b"
else
echo "$a -gt $b:a不大于b"
fi
if [ $a -le $b ]
then
echo "$a -le $b:a小于b"
else
echo "$a -le $b:a不小于b"
fi
运行结果:
布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为false则返回true,否则返回false | [ !false ] 返回true |
-o | 或运算,有一个表达式为true则返回true | [ $a -lt $b -o $a -le $b ] 返回true |
-a | 与运算,两个表达式均为真则返回true | [ $a -gt $b -a $a -eq $b ] |
#!/bin/bash
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b: $a 不等于 $b"
else
echo "$a == $b: $a 等于 $b"
fi
if [ $a -lt $b -o $a -le $b ]
then
echo "$a 小于 $b 或者 $a 小于等于 $b"
else
echo "$a 不小于或者等于$b"
fi
if [ $a -gt $b -a $a -eq $b ]
then
echo "$a 大于 $b 并且 $a 不等于 $b"
else
echo "$a 不大于 $b 并且 $a 不等于 $b"
fi
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑与 | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑或 | [[ $a -lt 100 |
#!/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
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”
运算符 | 说明 | 举例 |
---|---|---|
= | 检查两个字符串是否相等 | [ $a = $b ] 返回false |
!= | 检查两个字符串是否不相等 | [ $a != $b ] 返回true |
-z | 检查字符串的长度是否为0,为0则返回true | [ -z $a ] 返回false |
-n | 检查字符串长度是否不为0,不为0则返回true | [ -n “$a” ] 返回true |
$ | 检测字符串是否为空,不为空返回 true | [ $a ] 返回true |
#!/bin/bash
a="abc"
b="efg"
if [ $a = $b ]
then
echo "$a = $b: 字符串a和字符串b相等"
else
echo "$a != $b: 字符串a和字符串b不相等"
fi
if [ -z $a ]
then
echo "$a 的长度为0"
else
echo "$a 的长度不为0"
fi
文件测试运算符
echo命令
显示普通字符串
echo "Although we are in different cities, we cherish
each other "
显示转义字符串
echo ""wxnl""
显示变量
#!/bin/bash
echo "请输入你的名字:"
read name
echo "You are $name"
显示换行
#!/bin/bash
echo "OK! n"
echo "乖乖"
显示不换行
#!/bin/bash
echo "This is c"
echo "xff"
显示结果定向至文件
原样输出字符串,不进行转义或取变量
echo '$name"'
显示命令执行结果
echo `date`
流程控制
if-else
语法格式:
if condition
then
command1
command2
…
commandN
else
command
fi
a=10
b=20
if [ $a -gt $b ]
then
echo "$a > $ $b: a大于b"
else
echo "$a < $b: a小于b"
fi
for循环
语法格式1:
for var in item1 item2 … itemN
do
command1
command2
…
commandN
done
#!/bin/bash
for tmp in 1 2 3 4 5
do
echo "This is $tmp"
done
语法格式2:
for((assignment;condition:next));do
command_1;
command_2;
commond_…;
done;
#!/bin/bash
for((i=0;i<=500;i++));do
if [ "$((i%7))" -eq 0 ]
then
echo $i
fi
done;
while循环
语法格式:
while condition
do
command
done
#!/bin/bash
i=1;
while(( $i<=5 ))
do
echo $i
let "i++"
done
case选择语句
语法格式:
case 值 in
模式1)
command1
command2
…
commandN
;;
模式2)
command1
command2
…
commandN
;;
esac
#!/bin/bash
echo "请输入一个1到4之间的数字:"
echo "你输入的数字:"
read num
case $num in
1) echo "你选择了1"
;;
2) echo "你选择了2"
;;
3) echo "你选择了3"
;;
4) echo "你选择了4"
;;
*) echo "输入错误"
;;
esac
最后
以上就是虚拟奇迹为你收集整理的Shell脚本自学笔记的全部内容,希望文章能够帮你解决Shell脚本自学笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复