Linux Shell 学习笔记

本文详细介绍了Shell中的变量赋值、引用,数组操作,函数定义、参数传递,以及流程控制、输入输出、可移植性和安全性的核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原版文档地址

https://www.gnu.org/software/bash/manual/bash.html

1.Shell 变量

变量的基本赋值

      var=value

var 是变量名,value 为变量值;

如果变量值不包含任何空格字符,可以直接赋值给变量;

如果变量值包含空格字符,则必须包括在双引号 "" 或者单引号 '' 内;

var="Hello world."

Shell引用变量

引用一个普通变量

myName=Wrong;

myAge=28;

echo $myName $MyAge

当变量可能会和其他文字组合会音箱占位符时,可以用${temp}来引用变量

例如:

echo myNickName is: ${myName}Try 

引用特殊变量

特殊变量列表
变量含义
$0当前脚本的文件名
$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#传递给脚本或函数的参数个数。
$*传递给脚本或函数的所有参数。
$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
$?上个命令的退出状态,或函数的返回值。
$$当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

declare|typeset  [+/-][选项] 变量名

选项:

-:给变量舍得类型属性

+:取消变量的类型属性

-a:将变量声明为数组型

-A:将变量声明为数组型

-i:将变量声明为整型

-x:将变量声明为环境变量

-r:将变量声明为只读变量

-p:查看变量的被声明的类型

 

shell支持的基本数据类型

字符串

if [ str1 = str2 ]       当两个串有相同内容、长度时为真 
if [ str1 != str2 ]      当串str1和str2不等时为真 
if [ -n str1 ]       当串的长度大于0时为真(串非空) 
if [ -z str1 ]        当串的长度为0时为真(空串) 
if [ str1 ]         当串str1为非空时为真
 

 

2.Shell Array数组

 数组的定义与赋值

在 Shell 中,

  • 用括号来表示数组,数组元素用"空格"符号分割开

定义数组的一般形式为

数组名=(值1 值2 ... 值n)
array_name=(value0 value1 value2 value3);
array_name=(
value0
value1
value2
value3
);
  • 可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
  • 可以不使用连续的下标,而且下标的范围没有限制也就是说下标不用强制联系。

读取数组元素值的一般格式

${数组名[下标]}
例如:
valuen=${array_name[n]}
使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}

把字符串当数组来使用

获取数组的长度和获取某个元素的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

删除数组中的元素

unset array_name[index]

截取数组中的元素

复制新数组时顺带使用正则替换元素

 

3.Shell Map

申明Map

declare -A myMap=(["my01"]="01" ["my02"]="02")
myMap["my03"]="03"
myMap["my04"]="04"

输出Map所有的key、value、长度

# 1)输出所有的key
#若未使用declare声明map,则此处将输出0,与预期输出不符,此处输出语句格式比arry多了一个!
echo ${!myMap[@]}
#2)输出所有value
#与array输出格式相同
echo ${myMap[@]}
#3)输出map长度
#与array输出格式相同
echo ${#myMap[@]}

4.Shell Function函数

函数定义

申明一个函数

[ function ] funname [()]
{
    action;
    [return int;]
}

说明:上述的括号[]代表可选

  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
  • 3、所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

函数参数

传递一个或多个参数

function method(){

   //输入的多个参数会被当作动态数组来处理

    echo ${1},${2},${n}//获取指定位置的参数

    echo ${@}//获取输入的全部参数

    echo ${*} //获取输入的全部参数

    echo ${#} //获取输入参数的个数

}

 

传递一个或多个数组作为参数

arr_1=(1 2 3 4 5 6);

arr_2=( a b c d e f );

method ${arr_1[@]} ${arr_2[@]}

//method里接受到的是arr_1+arr_2里的全部元素组成的新数组

传递map(通过反射)

declare -A map=(["x"]=(1 2 3 4 5 ) ["y"]=( a b c d e f ));

function test_method_recive_map_param(){

local mp=$(declare -p "$1")//输入的第一个参数的地址

eval "declare -A local ref="${mp#*=}

echo keys:${!ref[@]}

echo values:${ref[@]} echo ${mp}

}

test_method_recive_map_param map

5.Shell Native Call本地调用

在shell里调用一些本地命令,然后获取执行结果,例如:有一个定时器会定期调用一个重启某个进程(例如tomcat端口固定为8080)的脚本, 

 

6.Shell test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。


数值测试

参数说明
-eq等于则为真
-ne不等于则为真
-gt大于则为真
-ge大于等于则为真
-lt小于则为真
-le小于等于则为真

实例

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

输出结果:

两个数相等!

代码中的 [] 执行基本的算数运算,如:

实例

#!/bin/bash

a=5
b=6

result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"

结果为:

result 为: 11

字符串测试

参数说明
=等于则为真
!=不相等则为真
-z 字符串字符串的长度为零则为真
-n 字符串字符串的长度不为零则为真

实例

num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

输出结果:

两个字符串不相等!

文件测试

参数说明
-e 文件名如果文件存在则为真
-r 文件名如果文件存在且可读则为真
-w 文件名如果文件存在且可写则为真
-x 文件名如果文件存在且可执行则为真
-s 文件名如果文件存在且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真

实例

cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

输出结果:

文件已存在!

另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如:

实例

cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一个文件存在!'
else
    echo '两个文件都不存在'
fi

输出结果:

至少有一个文件存在!

7.Shell 流程控制

if 

if 语句语法格式:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

写成一行(适用于终端命令提示符):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

末尾的 fi 就是 if 倒过来拼写。

字符串的比较

if [ str1 = str2 ]       当两个串有相同内容、长度时为真 
if [ str1 != str2 ]      当串str1和str2不等时为真 
if [ -n str1 ]       当串的长度大于0时为真(串非空) 
if [ -z str1 ]        当串的长度为0时为真(空串) 
if [ str1 ]         当串str1为非空时为真
 

if else

if else 语法格式:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

if else-if else 语法格式:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

不用if 利用[express]||continue 拦截代码被执行

 

8.Shell 输入输出

 

9.Shell 可移植性与扩展

 

10.Shell Security 安全问题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值