一,shell入门
-
什么是shell
- 不要把简单问题复杂化,不要把shell当编程语言
- 我说shell不是编程语言的原因就在这里,4个点就是shell全部,和传统编程不一样的。)
- 变量:可以定义和使用变量来存储数据。
- 条件语句:可以使用
if
、case
等条件语句来控制代码的执行流。 - 循环:支持
for
、while
、until
等循环结构来重复执行代码块。 - 函数:可以定义和调用函数来组织和重用代码。
- 最好每个部分都有空格,比如,变量与符号之间,a = b + c
- 常见的shell:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- 最常用的shell是Bash,也就是Bourne Again Shell。Bash由于易用和免费,在日常工作中被广泛使用,也是大多数Linux操作系统默认的Shell环境。
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
- 什么是shell
- 你可以把她(是的,当她是女生时候,我会一直操作她)当做一个软件
-
shell编程注意事项
- shell 命名:Shell脚本名称命名一般为英文、大写、小写,后缀以.sh 结尾
- 不能使用特殊符号、空格
- 见闻之意,名称要写的一眼可以看出功能
- shell 编程 首行需要 #!/bin/bash 开头
- shell 脚本 变量 不能以 数字、特殊符号开头,可以使用下划线_,但不能 用破折号 -
-
第一个shell脚本hello world
- touch hello_world.sh#创建一个shell文件
- vim hello_world.sh#进入文件编辑
- #!/bin/bash
#这句话表示告诉系统去bin中找bash执行这个文件
echo "hello world"
#echo 是一个输出语句,输出后面的东东
- #!/bin/bash
- ./Helloword.sh#执行文件,当然用户权限不够,要改权限
- 芜湖,不错,是不是简单的很,我敢说比py还简单。
- touch hello_world.sh#创建一个shell文件
二,shell环境变量讲解
-
shell变量详解
- # 什么是变量
- 就是房间(酒店的),声明变量就是告诉系统,说“‘嗨,给我来一块内存空间,我要存东西’”,你去酒店说:“老板来间房,我要睡觉。”而变量名就是房间号。
- # 常见的3种变量
- Shell编程中变量分为三种,分别是系统变量、环境变量和用户变量
- 变量名由大小写字母,下划线,数字任意组合,但是下划线不开头
- #举个王八,哈哈哈开玩笑,举个pear
- # 什么是变量
-
shell系统变量,介绍
- 主要是用于对参数判断和命令返回值判断时使用
- $0 当前脚本的名称;
- $n 表示当前脚本的第
n
个参数,n
的值可以是 1 到 9。 - $* 当前脚本的所有参数(不包括程序本身);
- $# 当前脚本的参数个数(不包括程序本身);
- $? 令或程序执行完后的状态,返回0表示执行成功;
- $$ 程序本身的PID号。
-
#!/bin/bash echo "第一个参数: $1" echo "第二个参数: $2" echo "第三个参数: $3"
- 主要是用于对参数判断和命令返回值判断时使用
-
shell环境变量,介绍
-
#Shell常见的变量之二环境变量,主要是在程序运行时需要设置,环境变量详解如下: PATH 命令所示路径,以冒号为分割; HOME 打印用户家目录; SHELL 显示当前Shell类型; USER 打印当前用户名; ID 打印当前用户id信息; PWD 显示当前所在路径; TERM 打印当前终端类型; HOSTNAME 显示当前主机名; PS1 定义主机命令提示符的; HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间; RANDOM 随机生成一个 0 至 32767 的整数; HOSTNAME 主机名 #我在之前的脚本后添加了一个echo $PATH
-
-
shell用户环境变量
- 用户变量又称为局部变量,主要用在Shell脚本内部或者临时局部使用
- 记得酒店房间吗?就是为这个准备的。
- 当我设置了局部变量,然后关闭终端再打开就会发现,变量没了
- 对了,echo是打印语句,字符操作界面中可以良好的告诉你,一件事的到了哪一步了,当然图形化跟直接,但是没有字符的细节。
- echo -e 扩展
- 转义字符
转义字符 说明 示例 \n
换行 echo -e "Hello\nWorld"
\t
水平制表符(Tab 键) echo -e "Hello\tWorld"
\\
输出反斜杠 \
echo -e "Hello\\World"
\b
退格(删除前一个字符) echo -e "Hello\bWorld"
\r
回车(将光标移动到行首) echo -e "Hello\rWorld"
\a
发出警报音 echo -e "\a"
\v
垂直制表符 echo -e "Hello\vWorld"
\0NNN
ASCII 编码对应的字符(八进制) echo -e "\041"
(输出!
)\xNN
ASCII 编码对应的字符(十六进制) echo -e "\x21"
(输出!
) -
常见颜色代码
颜色 前景色代码 背景色代码 黑色 30 40 红色 31 41 绿色 32 42 黄色 33 43 蓝色 34 44 紫色 35 45 青色 36 46 白色 37 47 文字样式代码
样式 代码 重置样式 0 加粗 1 斜体 3 下划线 4 反显 7 隐藏 8 -
#字符颜色与格式操作 echo -e "\e[【字符样式代码】;颜色代码m文本内容\e[0m" #\e[ 或 \033[:表示开始使用 ANSI 转义序列。 #颜色代码:指定颜色的代码。 #m:表示结束颜色代码的部分。 #\e[0m:表示重置颜色,恢复到默认状态。
- 转义字符
三,shell编程流程控制语句以及函数
-
if条件语句介绍
-
1. 单分支 if 语句 ············································ if 条件; then # 条件为真时执行的命令 fi ············································ 示例: ············································ if [ -f /etc/passwd ]; then echo "文件存在" fi 2. 双分支 if-else 语句 ············································ if 条件; then # 条件为真时执行的命令 else # 条件为假时执行的命令 fi ············································ 示例: ············································ if [ -d /home/user ]; then echo "/home/user 目录存在" else echo "/home/user 目录不存在" fi 3. 多分支 if-elif-else 语句 ············································ if 条件1; then # 条件1为真时执行的命令 elif 条件2; then # 条件2为真时执行的命令 else # 条件1和条件2都不为真时执行的命令 fi ············································ 示例: ············································ if [ "$1" -eq 1 ]; then echo "输入的是1" elif [ "$1" -eq 2 ]; then echo "输入的是2" else echo "输入的不是1或2" fi ············································ 4. 嵌套 if 语句 可以在 if 语句内部嵌套另一个 if 语句。 ············································ 示例: ············································ if [ -d /home/user ]; then if [ -f /home/user/file.txt ]; then echo "文件存在" else echo "文件不存在" fi else echo "目录不存在" fi ············································ 5. 条件测试符 ············································ -f 文件:判断文件是否存在并且是普通文件。 -d 目录:判断是否是目录。 -e 文件:判断文件或目录是否存在。 -n 字符串:判断字符串是否非空。 -z 字符串:判断字符串是否为空。 数值1 -eq 数值2:判断两个数是否相等。 数值1 -gt 数值2:判断数值1是否大于数值2。 ············································ 注意事项: ············································ 条件必须用方括号 [] 或双括号 [[]] 包围,且要注意方括号与条件之间的空格。 then 可以与 if 同行写,但必须用分号隔开,例如:if 条件; then。
1. 文件判断符号 判断符号 解释 -e 文件名 判断文件或目录是否存在 -f 文件名 判断是否是普通文件 -d 目录名 判断是否是目录 -r 文件名 判断文件是否有读权限 -w 文件名 判断文件是否有写权限 -x 文件名 判断文件是否有执行权限 -s 文件名 判断文件是否非空 -L 文件名 判断是否是符号链接 -p 文件名 判断是否是命名管道 -c 文件名 判断是否是字符设备文件 -b 文件名 判断是否是块设备文件 2. 字符串判断符号 判断符号 解释 -z 字符串 判断字符串是否为空 -n 字符串 判断字符串是否非空 字符串1 = 字符串2 判断两个字符串是否相等 字符串1 != 字符串2 判断两个字符串是否不相等 字符串1 < 字符串2 判断字符串1是否小于字符串2(按字典顺序) 字符串1 > 字符串2 判断字符串1是否大于字符串2(按字典顺序) 3. 整数判断符号 判断符号 解释 整数1 -eq 整数2 判断两个整数是否相等 整数1 -ne 整数2 判断两个整数是否不相等 整数1 -gt 整数2 判断整数1是否大于整数2 整数1 -ge 整数2 判断整数1是否大于或等于整数2 整数1 -lt 整数2 判断整数1是否小于整数2 整数1 -le 整数2 判断整数1是否小于或等于整数2 4. 逻辑判断符号 判断符号 解释 ! 表达式 逻辑非,取反 表达式1 -a 表达式2 逻辑与,表达式1 和 表达式2 同时为真时为真 表达式1 -o 表达式2 逻辑或,表达式1 或 表达式2 任意一个为真时为真 5. 双方括号 [[]] 中的运算符 双方括号 [[]] 支持更多操作符,并且对字符串比较更加直观。 判断符号 解释 [[ $var == pattern ]] 模式匹配,支持通配符 *,? [[ $var =~ regex ]] 使用正则表达式匹配 [[ $str1 > $str2 ]] 字符串比较,判断 $str1 是否大于 $str2(按字典顺序) [[ $str1 < $str2 ]] 字符串比较,判断 $str1 是否小于 $str2(按字典顺序)
-
-
for循环语句介绍
-
基本语法: ············································ for 变量 in 列表; do # 循环体 done ············································ C 风格语法: ············································ for (( 初始化; 条件; 更新 )); do # 循环体 done ············································ 文件名迭代: ············································ for 文件 in /path/to/directory/*; do # 循环体 done ············································ 命令输出迭代: ············································ for 变量 in $(命令); do # 循环体 done ············································ 数组迭代: ············································ for 变量 in "${数组[@]}"; do # 循环体 done ············································ break 和 continue 控制: ············································ for 变量 in 列表; do if [ 条件 ]; then break # 退出循环 fi if [ 条件 ]; then continue # 跳过当前循环的剩余部分 fi # 循环体 done
#!/bin/bash #遍历目录 for dir in $(ls /etc/);do echo $dir done ------------------------ #当然还有这种的 for dir in /etc/*;do echo $dir done #选一个就行了
-
-
while循环语句介绍
-
1. 基本 while 语法 ············································ while [ 条件 ]; do # 循环体 done 2. 读取文件 ············································ while IFS= read -r line; do # 处理每一行 done < 文件名 IFS=:设置内部字段分隔符为空,防止 read 命令截断行首和行尾的空白字符。 如果:IFS="a" read -r variable对于grape就返回$variable=grpe while IFS="a" read -r field1 field2对于grape就返回$field=gr $field2=pe read -r line:从文件中读取一行并将其赋值给变量 line,-r 选项确保读取时不解释反斜杠作为转义字符。 done < 文件名:< 文件名 表示将文件的内容逐行读入循环。 3. 无限循环 ············································ while true; do # 循环体 done 4. 使用 break 退出循环 ············································ while [ 条件 ]; do if [ 条件 ]; then break fi done 5. 使用 continue 跳过循环 ············································ while [ 条件 ]; do if [ 条件 ]; then continue fi done
#!/bin/bash while IFS='a' read -r v1 v2;do echo "字段1:$v1;字段2:$v2" done < $1
-
-
case选择语句介绍
-
case 变量 in 模式1) # 当变量匹配模式1时执行的命令 ;; 模式2) # 当变量匹配模式2时执行的命令 ;; 模式3) # 当变量匹配模式3时执行的命令 ;; *) # 默认情况,当没有其他模式匹配时执行的命令 ;; esac 模式1, 模式2, 模式3:用于匹配 变量 的模式,支持通配符 * 和 ?。 [0-9]也支持 ;;:表示当前模式匹配完成后的结束符。 *):默认分支,相当于 else,匹配其他未列出的情况。 esac:case 语句的结束标志,相当于 fi 结束 if 语句。
#!/bin/bash case $1 in *.txt) echo "文本文件" ;; *.png|*.jpg) echo "图形文件" ;; *.sh) echo "脚本文件" ;; *) echo "其他文件" ;; esac
-
-
select选择语句介绍
-
select 变量 in 选项1 选项2 选项3 ...; do # 根据用户选择执行相应的操作 break # 通常会在执行完操作后退出循环 done select 选择语句在 Bash 脚本中用于创建一个简单的交互式菜单,让用户从多个选项中选择。它特别适合用于需要让用户通过菜单输入选择的情况。 变量:存储用户选择的选项的值。 选项1 选项2 ...:显示给用户的多个选项列表。 do ... done:循环体,用于执行相应的操作,直到满足某个条件(如使用 break 退出循环)。 ctrl+d:强制退出
#!/bin/bash select a in a b c d e f; do if [ "$a" = "a" ]; then echo "你选择了 $a" elif [ "$a" = "b" ]; then echo "你选择了 $a" elif [ "$a" = "c" ]; then echo "你选择了 $a" elif [ "$a" = "d" ]; then echo "你选择了 $a" elif [ "$a" = "e" ]; then echo "你选择了 $a" else echo "无效选择" fi done
-
-
shell函数,数组编程
-
Shell 函数 1. 定义函数的语法: ························································ function 函数名() { # 函数体 # 一些命令 } ························································ 或: ························································ 函数名() { # 函数体 # 一些命令 } ························································ 2. 函数的调用: ························································ 函数名 # 直接调用函数 ························································ 3. 示例函数: ························································ #!/bin/bash # 定义函数 greet() { echo "Hello, $1!" } # 调用函数并传递参数 greet "World" ························································ Shell 数组 ························································ 1. 定义数组: Shell 支持一维数组,数组中的元素可以是字符串或数字,索引从 0 开始。 ························································ # 定义数组 arr=("元素1" "元素2" "元素3") ························································ # 或 ························································ arr[0]="元素1" arr[1]="元素2" arr[2]="元素3" ························································ 2. 访问数组元素: ························································ echo ${arr[0]} # 输出数组第一个元素 ························································ 3. 访问整个数组: ························································ echo ${arr[@]} # 输出数组的所有元素 ························································ 4. 获取数组长度: ························································ echo ${#arr[@]} # 输出数组的长度 ························································ 5. 添加或修改数组元素: ························································ arr[3]="元素4" # 添加新元素到数组中 arr[1]="新元素2" # 修改已有元素 ························································ 6. 遍历数组: ························································ for i in "${arr[@]}"; do echo $i done
#!/bin/bash #结合函数的遍历数组 arr=(1 2 3 4 5) a="buhao" #全局变量 get(){ echo $a local a="nhao" #local 关键字用于声明局部变量。局部变量只在函数的作用域内有效,函数执行完毕后就会销毁,不会影响全局的环境。 for i in ${arr[@]};do echo $i done } get echo $a #变量赋值的时候不可以有空格
-
${array[@]}
与${array[*]}
的区别-
${array[@]}
:遍历数组常用- 将数组的每个元素作为独立的参数传递。例如,在循环中使用时,每个数组元素会被单独处理。
- 对于数组元素中包含空格的情况,它会保留每个元素的完整性。
-
arr=("one" "two three" "four")
for item in "${arr[@]}"; do
echo "$item"
done
输出
one
two three
four
-
-
${array[*]}
:输出整个数组作为字符串- 将数组的所有元素作为一个单一的字符串传递。如果数组元素之间有空格,则整个数组会被合并成一个字符串。
- 默认情况下,元素之间由第一个字符
$IFS
(内部字段分隔符)分隔(通常是空格)。-
arr=("one" "two three" "four")
echo "${arr[*]}"
输出
one two three four
-
-
-