linux shell 脚本入门学习(一变量数组传参)
Posted 胖鹅68
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell 脚本入门学习(一变量数组传参)相关的知识,希望对你有一定的参考价值。
文章参考
一、快速入门
查看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. 变量
- 字符串可以用单引号,也可以用双引号,也可以不用引号。
#!/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 2 3 4 5
for i in "$*"
do
echo $i
done
- 使用
$@
遍历参数
# 运行结果
# 1
# 2
# 3
# 4
# 5
for j in "$@";do
echo $j
done
c. 数组
定义数组
- Shell 数组用括号来表示
- 元素用"空格"符号分割开
数组名=(值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
- 删除一个数组成员,使用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
- 删除成员也可以将这个成员设为空值。
$ foo=(a b c d e f)
$ foo[1]=''
$ echo ${foo[@]}
a c d e f
- 由于空值就是空字符串,所以下面这样写也可以,但是不建议这种写法
$ foo[1]=
unset ArrayName可以清空整个数组
。
unset foo
循环数组
${!array[@]} 或 ${!array[*]},可以返回数组的成员序号,即哪些位置是有值的。
- 根据序号循环遍历数组
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
- 拷贝数组
hobbies=( "${activities[@]}" )
hobbies=( "${activities[@]" diving )
- 关联数组
declare -A可以声明关联数组。
declare -A colors
colors["red"]="#ff0000"
colors["green"]="#00ff00"
colors["blue"]="#0000ff"
思维导图下载
以上是关于linux shell 脚本入门学习(一变量数组传参)的主要内容,如果未能解决你的问题,请参考以下文章