网站产品整合推广,手机开发小程序,建设企业网站企业网上银行,烟台网站建设威企汇互联见效付款文章目录 1. 总体认识1.1. Shell概述1.2. 第一个Shell脚本1.3. 注释 2. 变量2.1. 定义变量2.2. 使用变量2.3. 只读变量2.4. 删除变量2.5. 变量类型2.5.1. 字符串变量2.5.2. 整数变量2.5.3. 数组变量2.5.4. 环境变量2.5.5. 特殊变量 3. 输出3.1. echo命令3.2. printf命令 4. 运算… 文章目录 1. 总体认识1.1. Shell概述1.2. 第一个Shell脚本1.3. 注释 2. 变量2.1. 定义变量2.2. 使用变量2.3. 只读变量2.4. 删除变量2.5. 变量类型2.5.1. 字符串变量2.5.2. 整数变量2.5.3. 数组变量2.5.4. 环境变量2.5.5. 特殊变量 3. 输出3.1. echo命令3.2. printf命令 4. 运算符4.1. 运算表达式4.2. 条件表达式4.2.1. 关系运算符4.2.2. 逻辑运算符4.2.3. 字符串运算符4.2.4. 文件测试运算符 5. 流程控制5.1. 条件语句5.1.1. if语句5.1.2. case多选择语句 5.2. 循环语句5.2.1. for循环5.2.2. while循环5.2.3. 无限循环5.2.4. until循环5.2.5. 跳出循环 6. 函数7. 输入输出重定向8. 文件包含9. 常用shell命令9.1. alias 1. 总体认识
1.1. Shell概述
Shell是一个用C语言编写的程序这个程序提供了一个界面用户通过这个界面可以访问操作系统内核的服务。Shell既是一种命令语言又是一种解释型的程序设计语言。Shell脚本shell script是一种为shell编写的脚本程序。Shell编程只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Linux的Shell种类众多常用的有Bourne Shell/usr/bin/sh或/bin/sh、Bourne Again Shell/bin/bash、C Shell/usr/bin/csh、K Shell/usr/bin/ksh等等其中Bourne Again Shell是Bourne Shell的增强版本兼容性更好且提供了更多的特性和功能。由于易用和免费Bash是大多数Linux系统默认的Shell。
1.2. 第一个Shell脚本
文件名test.sh#!/bin/bash
echo Hello World!shell脚本名*.sh。第一行使用#!指定解释器路径。第二行echo语句的作用是在终端显示指定内容。 运行Shell脚本 作为可执行程序 chmod x ./test.sh # 使脚本具有执行权限
./test.sh # 执行脚本作为解释器参数 bash test.sh1.3. 注释
单行注释以#开头的行会被解释器忽略。多行注释
:EOF
Here文档中的内容不会被执行
EOF: delimiterdocument
delimiter:
冒号代表空命令后面的内容不会执行2. 变量
变量是存储的数据值的名称。
2.1. 定义变量
variablevalue注意变量名和等号之间不能有空格。变量命名要求 只由字母、数字和下划线组成不能以数字开头。避免使用Shell关键字。习惯上常量的变量名通常使用大写字母
2.2. 使用变量
variablevalue
echo $variable
echo ${variable}变量名外面的花括号是可选的加花括号是为了帮助解释器识别变量的边界。已定义的变量可以被重新定义。variablevalue1
echo $variable
variablevalue2
echo $variable2.3. 只读变量
variablevalue
readonly variable2.4. 删除变量
variablevalue
unset variable变量被删除后不能再次使用。unset 命令不能删除只读变量。
2.5. 变量类型
2.5.1. 字符串变量
str1hello
str2hello
str3hello变量通常被视为字符串。可以使用单引号 ’ 或双引号 来定义字符串单引号字符串的限制 单引号字符串里的任何字符都会原样输出不能进行变量值的替换。单引号字符串中不能出现单独一个的单引号对单引号使用转义符后也不行但可成对出现作为字符串拼接使用。 双引号字符串nameworld
str\Hello,$name! \\n
echo -e $str双引号字符串中可以进行值的替换。双引号字符串中可以出现转义字符。使用echo语句显示\n要添加参数-e。 拼接字符串
nameworld# 使用双引号
str1hello, $name!
str2hello, $name! # 推荐# 使用单引号
str3hello, $name!获取字符串的长度
strhello
echo ${#str}
echo ${#str[0]}提取子字符串
strHello, World!
echo ${str:1:4} # 输出ello查找子字符串
strHello, World# 获得字符l,o第1次出现时已经读取的字符串部分
x${str%%[lo]*} # x的值为He
# x的长度加1即为首次出现指定字符的索引
echo $((${#x}1)) # 输出32.5.2. 整数变量
declare -i intvar3
typeset -i intvar3这样的声明告诉Shell将intvar视为整数如果尝试将非整数值赋给它Shell会尝试将其转换为整数。
2.5.3. 数组变量
数组变量可以在一个变量中存储多个值。整数索引数组array1(1 2 3 4 5)
array2(12hello
)
array3[0]value0
array3[2]value2可以不使用连续的下标而且下标的范围没有限制。索引数组元素${数组名[索引]}获取所有元素${数组名[*]}或${数组名[]}两者的区别是后者常用于迭代。获取数组的长度${#数组名[*]}或${#数组名[]}获取数组单个元素的长度${#数组名[索引]} 关联数组declare -A asarray
asarray[name]John
asarray[age]30declare -A site([google]www.google.com[baidu]www.baidu.com
)键可以是任意的字符串或者整数键是唯一的使用键访问关联数组元素数组名[键]获得所有值${数组名[*]}或${数组名[]}两者的区别是后者常用于迭代。获得所有键${!数组名[*]}或${!数组名[]}两者的区别是后者常用于迭代。获得数组长度${#数组名[*]}或${#数组名[]}
2.5.4. 环境变量
环境变量是由操作系统或用户设置的特殊变量用于配置Shell的行为和影响其执行环境。PATH变量包含了操作系统搜索可执行文件的路径将路径添加PATHexport PATH${your_path}:$PATH直接在终端执行是临时设置要永久设置则须写入配置文件 当前登陆用户配置文件~/.bashrc所有用户的配置文件/etc/profile写入后要重新加载source ${config_path} 添加其他环境变量与PATH变量类似
2.5.5. 特殊变量
特殊变量作用$0脚本名称$1, $2, …脚本参数$#传递给脚本的参数数量$*以一个单字符串接收所有向脚本传递的参数$以$1 “ 2 … 2 … 2…n” 的形式接收所有参数常用于迭代$?上一个命令的退出状态0表示没有错误其他任何值表明有错误。$$脚本运行的当前进程ID号$!后台运行的最后一个进程的ID号$-显示Shell使用的当前选项与set命令功能相同。
3. 输出
3.1. echo命令
命令格式
echo string显示普通字符串
echo It is a test
echo It is a test显示转义字符
echo \It is a test\
echo \It is a test\显示变量
# 标准输入中读取一行不允许转义到变量name
read -r name
echo $name is good!显示换行
echo -e OK! \n # -e 开启转义
echo ******显示不换行
echo OK! \n # 原样输出\n
echo ******
echo -e OK! \c # -e 开启转义但不换行
echo ******原样输出字符串
echo $name\显示命令执行结果
echo Date: $(date)3.2. printf命令
printf命令模仿C程序库里的printf()函数。命令格式
printf format-string [arguments...]格式化字符串参照C语言格式只指定了一个参数但多出的参数仍然会按照该格式输出format-string被重用如果没有arguments那么%s用NULL代替%d用0代替格式化字符串中的%b格式 用于参数中存在\n时输出换行。用%s会原样输出\n。仅在%b格式下\c可以抑制不显示输出结果中任何结尾的换行字符而且其后的所有内容全部忽略。用%s会原样输出\c。
4. 运算符
4.1. 运算表达式
运算表达式的使用val$((2 2))
echo $val$((...))中不用考虑空格的问题变量不用加$号。支持的运算 运算符含义举例加法$((a b))-减法$((a - b))*乘法$((a * b))/除法$((a / b))%取余$((a % b))自增与C相同$((a))--自减与C相同$((a--))赋值右值作为结果$((a b))比较相等相等为1否则为0$((a - b))!比较不相等不相等为1否则为0$((a - b))比较大于大于为1否则为0$((a - b))比较小于小于为1否则为0$((a - b))比较大于等于大于等于为1否则为0$((a - b))比较小于等于小于等于为1否则为0$((a - b))
4.2. 条件表达式
条件表达式的使用a2
b1if test $a -eq $b
thenecho 相等
elif [ $a -ge $b ]
thenecho 大于
elif (($a $b))echo 小于
elseecho 错误
fi条件表达式通常用于流程控制中条件判断可以使用test 条件表达式条件判断可以使用[ 条件表达式 ]注意要有空格条件判断可以使用((条件表达式))此时可以不用考虑空格
4.2.1. 关系运算符
只支持数字不支持字符串。
运算符含义举例-eq检测两个数是否相等相等返true。[ $a -eq $b ]-ne检测两个数是否不相等不相等返回true。[ $a -ne $b ]-gt检测两个数是否大于右边的如果是则返回true。[ $a -gt$b ]-lt检测两个数是否小于右边的如果是则返回true。[ $a -lt $b ]-ge检测两个数是否大于等于右边的如果是则返回true。[ $a -ge $b ]-le检测两个数是否小于等于右边的如果是则返回true。[ $a -le $b ]
4.2.2. 逻辑运算符
优先级! ||存在短路运算。
运算符含义举例逻辑与运算[[ $a -lt 100 $b -gt 15 ]]||逻辑或运算[[ $a -lt 100 || $b -gt 15 ]]!逻辑非运算[[ ! $a -lt 100 ]]
4.2.3. 字符串运算符
运算符含义举例检测两个字符串是否相等相等返回 true。[ $a $b ]!检测两个字符串是否不相等不相等返回 true。[ $a ! $b ]-z检测字符串长度是否为0为0返回 true。[ -z $a ]-n检测字符串长度是否不为0不为0返回 true。[ -n $a ]$检测字符串是否不为空不为空返回 true。[ $a ]
4.2.4. 文件测试运算符
用于检测Unix文件的各种属性。
运算符含义举例-b检测文件是否是块设备文件如果是则返回 true。[ -b $file ]-c检测文件是否是字符设备文件如果是则返回 true。[ -c $file ]-d检测文件是否是目录如果是则返回 true。[ -d $file ]-f检测文件是否是普通文件既不是目录也不是设备文件如果是则返回 true。[ -f $file ]-g检测文件是否设置了 SGID 位如果是则返回 true。[ -g $file ]-k检测文件是否设置了粘着位(Sticky Bit)如果是则返回 true。[ -k $file ]-p检测文件是否是有名管道如果是则返回 true。[ -p $file ]-u检测文件是否设置了SUID位如果是则返回 true。[ -u $file ]-r检测文件是否可读如果是则返回 true。[ -r $file ]-w检测文件是否可写如果是则返回 true。[ -w $file ]-x检测文件是否可执行如果是则返回 true。[ -x $file ]-s检测文件是否为空文件大小是否大于0不为空返回 true。[ -s $file ]-e检测文件包括目录是否存在如果是则返回 true。[ -e $file ]-S判断某文件是否 socket。[ -S $file ]-L检测文件是否存在并且是一个符号链接。[ -L $file ]
5. 流程控制
5.1. 条件语句
5.1.1. if语句
最展开的格式
if 条件判断
then命令1命令2...
elif 条件判断
then命令1命令2...
else命令1命令2...
fi写成一行要加分号分隔
if 条件判断; then 命令; fi
if 条件判断; then命令1命令2...
fi5.1.2. case多选择语句
case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;*command1command2...commandN;;
esac5.2. 循环语句
5.2.1. for循环
最展开的格式
for var in item1 item2
do命令1命令2...
done写成一行要加分号分隔
for var in item1 item2; do 命令1; 命令2; done5.2.2. while循环
一般格式
while 条件判断
do命令1命令2...
done循环读取键盘输入
while read -r site
doecho 是的$site 是一个好网站
done5.2.3. 无限循环
while true
do命令
done5.2.4. until循环
先执行再判断
until 条件判断
do命令
done5.2.5. 跳出循环
break是跳出本级循环continue跳出本次循环
6. 函数
格式
function funname [()]
{action[return int;]
}[ function ] funname ()
{action[return int;]
}所有函数在使用前必须定义。调用函数仅使用其函数名即可。返回值 如果不return语句将以最后一条命令运行结果作为返回值。只能返回0-255。函数返回值在调用该函数后通过$?来获得。 函数参数与脚本的命令行参数相同
7. 输入输出重定向
文件描述符 0表示标准输入STDIN1表示标准输出STDOUT2表示标准错误输出STDERR 空设备文件nul指向/dev/null输出重定向到文件覆盖原文件。command file输出以追加的方式重定向到文件command file合并标准输出和标准错误输出并重定向到文件command file 21错误输出重定向到文件command 2 file将输入重定向为文件command fileHere文档将输入重定向为两个分隔符之间的内容command delimiterdocument
delimiter对标准输入和标准输出都进行重定向command file1 file2屏蔽命令输出command nul
command /dev/null8. 文件包含
. filename # 注意有空格
source filename上述语句会先执行指定shell脚本但是保留shell脚本执行结束会清理的变量等内容
9. 常用shell命令
9.1. alias
用于设置指令的别名语法
alias [别名][指令名称]注意多条指令用分号分隔