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 ... 是要遍历的列表,可以是空格分隔的多个元素。
相关推荐
实心儿儿1 天前
Linux —— 基础开发工具5
linux·运维·算法
oMcLin1 天前
如何在SUSE Linux Enterprise Server 15 SP4上通过配置并优化ZFS存储池,提升文件存储与数据备份的效率?
java·linux·运维
王阿巴和王咕噜1 天前
【WSL】安装并配置适用于Linux的Windows子系统(WSL)
linux·运维·windows
布史1 天前
Tailscale虚拟私有网络指南
linux·网络
水天需0101 天前
shift 命令详解
linux
wdfk_prog1 天前
[Linux]学习笔记系列 -- 内核支持与数据
linux·笔记·学习
Xの哲學1 天前
深入剖析Linux文件系统数据结构实现机制
linux·运维·网络·数据结构·算法
深圳市恒讯科技1 天前
Linux 文件权限指南:chmod 755、644、drwxr-xr-x 解析
linux·服务器·xr
朝阳5811 天前
Ubuntu 22.04 安装 Fcitx5 中文输入法完整指南
linux·运维·ubuntu
xingzhemengyou11 天前
Linux taskset指令设置或查看进程的 CPU 亲和性
linux·服务器