shell

一、第一个shell程序

powershell 复制代码
#!/bin/bash
#使用/bing/bash来解析脚本
echo "helloworld" #输出语句

注意:

写完shell脚本后,要给该脚本加上可执行权限(chmod +x file),才可有运行

二、变量和命令行参数

powershell 复制代码
#!/bin/bash

num=10 #不能有多与的空格
name="jack"
age=22
sex="male"

echo $num
echo "name: $name   age: $age   sex: $sex"

echo "输出命令行参数"
echo $1
echo $2
echo $3

echo "共有$#个命令行参数"
echo "所有参数:$*"
~                      

运行结果:

三、环境级变量、拥护级变量、系统级变量

1.环境级变量

定义 :环境级变量是在用户的操作环境中全局可用的变量,它们对于系统中的所有用户和进程都是可见的,除非被局部覆盖。
用法 :用于配置系统环境,如定义用户的主目录(HOME)、设置命令搜索路径(PATH)、指定默认编辑器(EDITOR)等。
设置方法: 在Shell会话中使用export VARIABLE_NAME=value命令或在用户级配置文件(如.bashrc)中设置,以便在每次登录时自动设置。
作用域: 当前终端

2.用户级变量

定义 :用户级变量是指仅对单个用户的Shell会话或脚本生效的变量。它们通常在用户的个人配置文件中定义,如.bash_profile、.bashrc或.profile。
用法 :用于定义用户特定的环境配置,如用户特定的路径添加、别名设置等。
设置方法 :在用户的个人配置文件中添加变量定义(例如,在.bashrc中添加VARIABLE_NAME=value),并通过source ~/.bashrc或重新登录来应用更改。
作用域: 相同用户

3.系统级变量

定义 :系统级变量是对系统上的所有用户和进程全局有效的变量。这些变量在系统级别的配置文件中设置,如/etc/environment、/etc/profile或/etc/bash.bashrc。
用法 :用于设置系统范围内的环境配置,如系统级别的路径设置或全局别名。
设置方法 :需要管理员权限来编辑系统级配置文件,并在文件中添加export VARIABLE_NAME=value。更改通常需要重新启动系统或新的登录会话才能生效。
作用域: 整个系统

4.代码实例

powershell 复制代码
export AA=100   #环境级变量 作用域:当前终端

echo "export AA=100" >> ~/.profile    #用户级变量 作用域:相同用户
#source ~/.profile

echo "export AA=100"  >> /etc/profile   #系统级变量 作用域:整个系统
#source /etc/profile

echo "打印环境变量"
echo $AA

四、运算

powershell 复制代码
#!/bin/bash

num=100
let num=num+100
echo $num

num=100
num=$[num+100]
echo $num

num=100
num=$((num+100))
echo $num

num=100
num=`expr $num + 100`
echo $num

五、数组

1.普通数组

使用示例:

powershell 复制代码
# 定义一个数组
fruits=("apple" "banana" "orange" "grape")

# 访问数组元素
echo ${fruits[0]}  # 输出第一个元素: apple
echo ${fruits[2]}  # 输出第三个元素: orange

# 修改数组元素
fruits[1]="mango"  # 将第二个元素修改为 mango

# 遍历数组元素
for fruit in "${fruits[@]}"
do
  echo $fruit
done

# 获取数组长度
echo ${#fruits[@]}  # 输出数组长度: 4

# 添加元素到数组末尾
fruits+=("kiwi")

# 删除数组元素
unset fruits[2]  # 删除第三个元素

# 清空数组
fruits=()

# 检查数组是否为空
if [ ${#fruits[@]} -eq 0 ]; then
  echo "数组为空"
fi

2.关联数组

在Shell脚本中,关联数组(Associative Arrays)是一种特殊类型的数组,其中每个元素都有一个关联的键(Key)和一个对应的值(Value)。与普通数组不同,关联数组的索引可以是任意字符串,而不仅限于数字。
使用示例:

powershell 复制代码
# 定义一个关联数组
declare -A fruits
fruits["apple"]="red"
fruits["banana"]="yellow"
fruits["orange"]="orange"
fruits["grape"]="purple"

# 访问数组元素
echo ${fruits["apple"]}  # 输出 "red"
echo ${fruits["banana"]}  # 输出 "yellow"

# 修改数组元素
fruits["banana"]="green"  # 将 "banana" 的值修改为 "green"

# 遍历数组元素
for key in "${!fruits[@]}"
do
  echo "Key: $key, Value: ${fruits[$key]}"
done

# 获取数组长度
echo ${#fruits[@]}  # 输出数组长度: 4

# 删除数组元素
unset fruits["orange"]  # 删除 "orange" 元素

# 清空数组
fruits=()

# 检查数组是否为空
if [ ${#fruits[@]} -eq 0 ]; then
  echo "数组为空"
fi

3.代码实例

powershell 复制代码
#!/bin/bash

arr1=(1 2 3 4 5)
arr2=('a' 'b' 'c' 'd' 'e')
arr3=("1111" "2222" "3333")

echo ${arr1[0]}
echo ${arr2[0]}
echo ${arr3[0]}

echo ${arr3[@]} #访问所有元素
echo ${#arr1[@]} #打印数组元素个数
echo ${!arr1[@]} #打印所有的下标
echo ${arr1[@]:1} #从第二个元素开始打印
echo ${arr1[@]:1:2} 

#关联数组
declare -A arr4
declare -A arr5
arr4[name]="jack"
arr4[age]=22
arr4[sex]="male"

arr5=([name]="tom" [age]=24 [sex]="male")

echo ${arr4[@]}
echo ${arr5[@]}

六、判断

1.if

powershell 复制代码
if [ condition ]; then
    # 执行条件为真时的代码
elif [ condition ]; then
    # 执行其他条件为真时的代码
else
    # 执行条件都不满足时的代码
fi

在if语句中,可以使用各种条件表达式来进行判断,如比较运算符(-eq, -ne, -lt, -gt, -le, -ge)、逻辑运算符(-a, -o, !)、字符串比较(=, !=, -z, -n)等。

比较运算符:

  • -eq:等于,用于比较两个值是否相等。例如:[ a -eq b \] ,如果变量 b \],如果变量 b\],如果变量a的值等于变量b的值,则条件为真。

  • -ne:不等于,用于比较两个值是否不相等。例如:[ a -ne b \] ,如果变量 b \],如果变量 b\],如果变量a的值不等于变量b的值,则条件为真。

  • -lt:小于,用于比较一个值是否小于另一个值。例如:[ a -lt b \] ,如果变量 b \],如果变量 b\],如果变量a的值小于变量b的值,则条件为真。

  • -gt:大于,用于比较一个值是否大于另一个值。例如:[ a -gt b \] ,如果变量 b \],如果变量 b\],如果变量a的值大于变量b的值,则条件为真。

  • -le:小于等于,用于比较一个值是否小于等于另一个值。例如:[ a -le b \] ,如果变量 b \],如果变量 b\],如果变量a的值小于等于变量b的值,则条件为真。

  • -ge:大于等于,用于比较一个值是否大于等于另一个值。例如:[ a -ge b \] ,如果变量 b \],如果变量 b\],如果变量a的值大于等于变量b的值,则条件为真。

  • =:等于,用于比较两个字符串是否相等。例如:[ str1 = s t r 2 \] ,如果变量 str2 \],如果变量 str2\],如果变量str1的值等于变量str2的值,则条件为真。

  • !=:不等于,用于比较两个字符串是否不相等。例如:[ str1 != s t r 2 \] ,如果变量 str2 \],如果变量 str2\],如果变量str1的值不等于变量str2的值,则条件为真。

  • -z:空字符串,用于判断字符串是否为空。例如:[ -z s t r ] ,如果变量 str ],如果变量 str],如果变量str的值为空,则条件为真。

  • -n:非空字符串,用于判断字符串是否非空。例如:[ -n s t r ] ,如果变量 str ],如果变量 str],如果变量str的值非空,则条件为真。

代码示例:

powershell 复制代码
#!/bin/bash

num=$1 #获取第一个参数
if [ -z $num ]; then
    echo "请输入参数"
    exit
fi


if [ $num -eq 100 ]; then
    echo "等于100"
elif [ $num -gt 100 ]; then
    echo "大于100"
elif [ $num -lt 100 ]; then
    echo "小于100"
fi

2.case

powershell 复制代码
case $variable in
    pattern1)
        # 匹配pattern1时执行的代码
        ;;
    pattern2)
        # 匹配pattern2时执行的代码
        ;;
    *)
        # 未匹配任何模式时执行的代码
        ;;
esac

case语句用于根据变量的值进行多模式匹配,每个模式可以使用通配符来匹配字符串。

代码示例:

powershell 复制代码
#!/bin/bash

read num 
case $num in
    [a-z])
        echo "小写字母";;
    [A-Z])
        echo "大写字母";;
    [0-9])
        echo "数字";;
    *)  
        echo "未知";;
esac

七、循环

1.while

powershell 复制代码
while condition
do
    # 代码块
done

代码示例:

powershell 复制代码
#!/bin/bash

while read i
do
    echo $i
done < $1

< 1 表示将文件的内容作为输入重定向到循环中。1 是脚本的第一个命令行参数,表示要读取的文件名。

因此,这段脚本会逐行读取指定文件的内容,并将每行内容输出到标准输出。可以通过命令行参数指定要读取的文件名,例如:

powershell 复制代码
./4.while.sh input.txt

2.for

powershell 复制代码
for variable in item1 item2 item3 ...
do
    # 代码块
done
  • variable 是一个变量名,用于存储列表中的每个元素。
  • item1 item2 item3 ... 是要遍历的列表,可以是空格分隔的多个元素。
相关推荐
snowfoootball44 分钟前
(自用)Linux 常用命令自查文档
linux·运维·服务器
R-G-B1 小时前
Linux常见命令总结 合集二:基本命令、目录操作命令、文件操作命令、压缩文件操作、查找命令、权限命令、其他命令
linux·基本命令·目录操作命令·linux常见命令·压缩文件操作·权限命令·查找命令
Chukai1231 小时前
Windows 和 Linux 系统下修改防火墙机制开放端口
linux·运维·windows
FL16238631292 小时前
[ubuntu][C++]onnxruntime安装cpu版本后测试代码
linux·c++·ubuntu
pound1273 小时前
Linux
linux·运维·服务器
learning_tom4 小时前
HTML图片标签及路径详解
linux·服务器·php
dbdr09015 小时前
Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十六天
linux·运维·服务器·网络·python·学习
大白的编程日记.5 小时前
【Linux学习笔记】信号的深入理解之软件条件产生信号
linux·笔记·学习
buyutang_6 小时前
C/C++ Linux系统编程:线程控制详解,从线程创建到线程终止
linux·c语言·c++·学习
云的牧人6 小时前
Ubuntu 22 redis集群搭建
linux·运维·ubuntu