shell

一、第一个shell程序

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

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

二、变量和命令行参数

#!/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.代码实例

export AA=100   #环境级变量 作用域:当前终端

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

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

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

四、运算

#!/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.普通数组

使用示例:

# 定义一个数组
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)。与普通数组不同,关联数组的索引可以是任意字符串,而不仅限于数字。
使用示例:

# 定义一个关联数组
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.代码实例

#!/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

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的值非空,则条件为真。

代码示例:

#!/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

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

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

代码示例:

#!/bin/bash

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

七、循环

1.while

while condition
do
    # 代码块
done

代码示例:

#!/bin/bash

while read i
do
    echo $i
done < $1

< $1 表示将文件的内容作为输入重定向到循环中。$1 是脚本的第一个命令行参数,表示要读取的文件名。
因此,这段脚本会逐行读取指定文件的内容,并将每行内容输出到标准输出。可以通过命令行参数指定要读取的文件名,例如:

./4.while.sh input.txt

2.for

for variable in item1 item2 item3 ...
do
    # 代码块
done

  • variable 是一个变量名,用于存储列表中的每个元素。
  • item1 item2 item3 … 是要遍历的列表,可以是空格分隔的多个元素。
  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值