Shell脚本自学笔记

第一个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

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值