一、第一个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 … 是要遍历的列表,可以是空格分隔的多个元素。