linux shell 脚本入门学习(一变量数组传参)

Posted 胖鹅68

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell 脚本入门学习(一变量数组传参)相关的知识,希望对你有一定的参考价值。

文章参考

  1. Shell 教程
  2. 阮一峰 Bash 脚本教程

一、快速入门

查看bash 类型

echo $BASH

基本语法介绍

  • 注释是 每行最前面为 #
  • shell脚本的后缀名是 sh
  • shell 脚本第一行是 #!/bin/bash

执行sh文件

  • 将文件设置为可执行的文件
chmod +x /path/to/test.sh
  • 运行可执行文件四种方式:
# 绝对路径
/path/to/test.sh
#相对路径
. /path/to/test.sh
#使用bash命令
bash /path/to/test.sh
#使用 source命令
source /path/to/test.sh

二、基本语法

a. 变量

  1. 字符串可以用单引号,也可以用双引号,也可以不用引号。
#!/bin/bash
# 变量字符串是双引号
myname="huangbiao"
# 变量字符串是单引号
myson='huanghaili'
# 变量字符串 没有双引号 和 单引号
littleson=huanghailiang

# 输出变量前  要加 $
echo $myname
# 输出变量前  要加$,可以额外添加{}包裹变量,便于解析
echo ${myson}
# 在双引号内解析变量
echo "我的小儿子名字叫 $littleson"
# 单引号 不解析变量
echo '我的小儿子名字叫 $littleson'

双引号 VS 单引号的区别

  • 单引号:
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
  • 双引号
    • 双引号里可以有变量
    • 双引号里可以出现转义字符

b.传递参数

规则

$0 
	为执行的文件名
$n
	n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
$#
	传递到脚本的参数个数
$*
	以一个单字符串显示所有向脚本传递的参数。
	如"$*"用「"」括起来的情况、以"$1 $2$n"的形式输出所有参数。
$$
	脚本运行的当前进程ID号
$!
	后台运行的最后一个进程的ID号
$@$*相同,但是使用时加引号,并在引号中返回每个参数。
	如"$@"用「"」括起来的情况、以"$1" "$2""$n" 的形式输出所有参数。
$-
	显示Shell使用的当前选项,与set命令功能相同。
$?
	显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$* 与 $@ 区别:

相同点:都是引用所有参数。

不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

案例

常用基本属性

#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";


echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

echo "显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 : $?"

测试:

./test.sh 1 2  3  4  5 6

遍历参数

[root@VM-0-4-centos shell_study]# ./first.sh 1 2 3 4 5
  1. 使用 $* 遍历参数
# 运行结果  1 2 3 4 5
for i in "$*"
do
echo $i
done
  1. 使用 $@ 遍历参数
# 运行结果
# 1
# 2
# 3
# 4
# 5
for j in "$@";do
echo $j
done

c. 数组

定义数组

  1. Shell 数组用括号来表示
  2. 元素用"空格"符号分割开
数组名=(值1 值2 ... 值n)
array_name=(value1 ... valuen)

例子

# array_name=(value0 value1 value2 value3)
# 等价于
array_name=(
value0
value1
value2
value3
)
# 重新赋值
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

数组赋值

数组名[下标]=新的值

读取数组,数组元素的下标由0开始。

语法: ${数组名[下标]}

注意:只能使用 ${} 这种方式, {}不能少

例子:

#!/bin/bash

my_array=(A B "C" D)
# 打印数组变量,一定要使用 ${} 这种方式,{} 不能省略
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"

my_array[3]=huangbiao
echo "第四个元素为: ${my_array[3]}"

给数组重新赋值

如果读取数组成员时,没有读取指定哪一个位置的成员,默认使用0号位置。

$ foo=(a b c d e f)
$ echo ${foo}
a
$ echo $foo
a

使用@ 或 * 可以获取数组中的所有元素

* 与 @ 区别:

相同点:都是引用所有参数。

不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”传递了一个参数),而 “@” 等价于 “1” “2” “3”传递了三个参数)。

结论: 循环数组每个对象,应该使用 @

使用场景

数组长度 ${#array[*]} && ${#array[@]}

myArray=(A B "C" D)
echo "${#myArray[@]}"
echo "${#myArray[*]}"

数组序号

${!array[@]} 或 ${!array[*]},可以返回数组的成员序号,即哪些位置是有值的

arr=([5]=a [9]=b [23]=c)
echo ${!arr[@]}
# 5 9 23
echo ${!arr[*]}
# 5 9 23

根据序号循环遍历数组

arr=(a b c d)
for i in ${!arr[@]};do
echo ${arr[i]}
done

使用序号遍历数组

arr=(a b c d)
for i in ${arr[@]};do
echo ${i}
done

数组字符串 ${array[*]} && ${array[@]}

案例

myArray=(A B "C" D)
echo "数组长度 ${#myArray[@]}"
echo "数组长度 ${#myArray[*]}"

echo "数组索引 ${!myArray[@]}"
echo "数组索引 ${!myArray[*]}"

echo "数组字符串 ${myArray[@]}"
echo "数组字符串 ${myArray[*]}"

d.数组CURD

访问数组

读取单个数据

echo ${array[i]}     # i 是索引

读取所有的数据

@和*是数组的特殊索引,表示返回数组的所有成员。

$ foo=(a b c d e f)
$ echo ${foo[@]}
# a b c d e f

添加数组

数组末尾追加成员,可以使用+=赋值运算符。它能够自动地把值追加到数组末尾。否则,就需要知道数组的最大序号,比较麻烦。

$ foo=(a b c)
$ echo ${foo[@]}
a b c
$ foo+=(d e f)
$ echo ${foo[@]}
a b c d e f

删除数组 unset

  1. 删除一个数组成员,使用unset命令
$ foo=(a b c d e f)
$ echo ${foo[@]}
a b c d e f
$ unset foo[2]
$ echo ${foo[@]}
a b d e f
  1. 删除成员也可以将这个成员设为空值。
$ foo=(a b c d e f)
$ foo[1]=''
$ echo ${foo[@]}
a c d e f
  1. 由于空值就是空字符串,所以下面这样写也可以,但是不建议这种写法
$ foo[1]=
  1. unset ArrayName可以清空整个数组
unset foo

循环数组

${!array[@]} 或 ${!array[*]},可以返回数组的成员序号,即哪些位置是有值的。

  1. 根据序号循环遍历数组
arr=(a b c d)
for i in ${!arr[@]};do
echo ${arr[i]}
done
  1. 直接访问数组
arr=(a b c d)
for i in ${arr[@]};do
echo ${i}
done
  1. 拷贝数组
hobbies=( "${activities[@]}" )
hobbies=( "${activities[@]" diving )
  1. 关联数组
    declare -A可以声明关联数组。
declare -A colors
colors["red"]="#ff0000"
colors["green"]="#00ff00"
colors["blue"]="#0000ff"

思维导图下载

以上是关于linux shell 脚本入门学习(一变量数组传参)的主要内容,如果未能解决你的问题,请参考以下文章

linux shell脚本学习

Linux学习总结(六十)shell脚本4-函数及数组

[Linux脚本]Shell脚本编程

[Linux脚本]Shell脚本编程

linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]

linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]