shell是与Linux交互的基本工具
shell script是针对shell所写的脚本,解释执行,无需编译
注意事项
- 指令的执行是从上而下、从左而右的分析与执行;
- 指令、选项与参数间的多个空白都会被忽略掉;
- 空白行也将被忽略掉,并且[tab]按键的空白同样视为空格键;
- 如果读取到一个Enter符号(CR),就尝试开始执行该行(或该串)命令;
- 如果一行的内容太多,则可以使用[Enter]]来延伸至下一行;
- [#]可做为注释!任何加在#后面的资料将全部被视为批注文字而被忽略!
执行
必须要具备可读可执行权限
直接命令执行
sudo chmod u+x test.sh
./test.sh
bash程序执行
shell名称 脚本名
将输入重定向到shell脚本
bash < 脚本名
内容
echo [-n -e]
-n:输出后不换行
-e:转义字符
#! /bin/bash
# author
# date: 2024-4-26
# function: the first sctiptecho "current time"
date
echo -n "env path:"$PATH
echo "current user name:`hzy`"
echo "current work path:"
pwdexit 0
内嵌脚本
#! /bin/bash
# author
# date: 2024-4-26
# function: the first sctiptecho "test:"
. test.shexit 0
调试
bash -v 脚本名
绝对路径
相对路径
变量path功能
重定向输入:bash < 脚本名
变量
变量就是以一组文字或符号等,来替代一些设置或者是一串保留的数据Shell编程中变量是非类型性质的,不必指定变量是数字还是字符串都需要事先声明
局部变量
局部变量在脚本或命令中定义,仅在当前shel实例中有效,其他shel启动的程序不能访问局部变量。
环境变量
所有的程序,包括shel1启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行,必要的时候shel脚本也可以定义环境变量。(是系统的一部分,无需定义,如PATH)
内部变量
是由shell程序设置的特殊变量,在程序内这些变量无法修改($#、?)。
$0:当前脚本名称
$n:传递给脚本或函数的参数,n表示第n个参数(下标从1开始)
$#:传递给脚本或函数的参数个数
$*:传递给脚本或函数的全部参数,把所有参数作为一个整体
$@:传递给脚本或函数的全部参数,把所有参数分开,分别传递
$?:上一个命令的退出状态,或者函数的返回值
$$:当前Shell进行的ID,对于脚本,就是脚本所在进程ID
变量赋值
w:=3
变量值读取
read [-ptn] variable1 variable2 variable3:将用户输入的数据分配给变量。
-p:提示用户输入数据,并在读取数据之前显示提示信息。
-t:设置超时时间,如果用户在指定的时间内没有输入数据,则返回失败。
-n:限制读取的字符数,只读取指定数量的字符。
例如
#!/bin/bashecho "请输入三个变量的值:"
read -p "variable1: " var1
read -p "variable2: " var2
read -p "variable3: " var3echo "您输入的变量值如下:"
echo "variable1: $var1"
echo "variable2: $var2"
echo "variable3: $var3"
替换变量
new_var=${old_var-content}:如果old_var不存在,content赋值给new_var
new_var=${old_var:-content}:为空也替换
new_var=${old_var:+content}:如果old_var是非空,content就赋值给new_var(与-号相反)
new_var=${old_var:?content}:如果old_var被删除或为空,将content输出到控制台
${w1:+${w3:=root}}
表示如果变量$w1
被定义且非空(即不为null或空字符串),则执行${w3:=root}
,否则返回null。
${w3:=root}
表示如果变量$w3
未被定义或为空,则将其赋值为字符串"root",否则保持其当前值不变
数组
bash只支持一维数组,没有限制大小。
下标由0开始。
数组名=(v1 v2 ... v3)(括号表示数组用空格分开)
单独定义:array[9]=0,无需定义数组,直接执行,除了已经定义的元素,其他为空(类似与字典,或者python的Counter())
读取数组:${array[1]},${array[*]}(数组所有元素),${array[@]}(数组所有元素),加#读取个数
表达式
只支持整数运算
算术运算符
expr 5 + 3#有空格val=`expr 5 + 3`#有空格val=$(expr 5 + 3)#有空格val=$[5+2]#无空格n=1
m=2
let val=$n+$m#无空格var=$((运算内容))#var=$((9+8))
关系运算符(逻辑表达式)
test 条件:判断
-eq:是否相等
-ne:不等
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
test "abc"=="xyz"[ "abc" == "xyz" ]#要空格
[ "abc" -eq "xyz" ]#要空格
布尔运算符
逻辑表达式
cmd1 && cmd2:与运算
cmd1 || cmd2:或运算
[逻辑表达式1 -a 逻辑表达式2]
-a:与运算
-o:或运算
!:非运算
返回0是true,false为非零值
字符串运算符
test -z string:是否为空
test -n string:是否为0
test string1=string2:是否相等
test string1!=string2:是否不等
test string:是否为空
文件测试运算符
-e:文件是否存在
-f:文件是否存在且为普通文件
-d:文件是否存在且为目录
-r:是否存在且可读
-w:是否存在且可写
-x:是否存在且可执行
语句
if-then
if [condition]; then当条件成立时执行内容
fi#结束判断if [condition1]; then当条件成立1时执行内容
elif [condition2];then当条件成立2时执行内容
else当条件不成立时执行内容
fi
while
不满足条件,循环结束
while [condition]
do执行内容
done
until
满足条件,循环结束,与while相反
until [condition]
do执行内容
done
for
for val in arr
do执行内容
done
break
continue
exit
函数
函数可以在Shell脚本中做出一个类似自定义执行命令的东西
函数的设置一定要在程序的最前面
不但可以简化程序代码,还可以做成类似“模块”的东西
函数也是有内部变量的,函数名称为$0,后续参数为$1,$2...
[function] name()
{return
}#调用
name val1 val2 val3 ... valN#例子
#!/bin/bash# 定义一个函数,用于计算两个数的和
function add() {local num1=$1local num2=$2local sum=$((num1 + num2))echo "两数之和为: $sum"
}# 调用函数
add 3 5