电商网站建设文献,韶关做网站需要多少钱,深圳做手机网站,网店推广的渠道有哪些本文旨在对y总的Linux基础课shell语法做学习记录#xff0c;指令较多#xff0c;方便日后查找。 参考视频#xff1a;Linux基础课 参考教程#xff1a;Linux教程
1 概论
Linux中常见的shell脚本有很多种#xff0c;常见的有#xff1a;
Bourne Shell(/usr/bin/sh或/bi…本文旨在对y总的Linux基础课shell语法做学习记录指令较多方便日后查找。 参考视频Linux基础课 参考教程Linux教程
1 概论
Linux中常见的shell脚本有很多种常见的有
Bourne Shell(/usr/bin/sh或/bin/sh)Bourne Again Shell(/bin/bash)C Shell(/usr/bin/csh)K Shell(/usr/bin/ksh)zsh…
Linux系统中一般默认使用bash文件开头需要写#! /bin/bash指明bash为脚本解释器 示例 mkdir -p Test vim test.sh i:进入编辑模式
#! /bin/bash
echo helloEsc:退出编辑模式 :wq 保存并退出
运行方式
作为可执行文件 chmod x test.sh: 使脚本具有可执行权限 ./test.sh: 当前路径下执行 /home/XXX/test.sh: 绝对路径下执行 ~/test.sh: 家目录路径下执行用解释器执行 bash test.sh
2 注释
单行注释
每行中#之后的内容均是注释
#! /bin/bash
echo Hello World # 这是注释多行注释
格式
:EOF
第一行注释
第二行注释
第三行注释
EOFEOF可以换成其它任意字符串(abc,!)
3 变量
定义变量
abig # 单引号定义字符串
bbig # 双引号定义字符串
cbig # 也可以不加引号同样表示字符串使用变量
$或者${}花括号是可选的主要为了帮助解释器识别变量边界
namebigdavid
echo $name
echo ${name}
echo ${name}big # 输出bigdavidbig只读变量
使用readonly或者declare可以将变量变为只读
namebigdavid
readonly name
declare -r namenameabc ##报错因为变量只读删除变量
unset可以删除变量
namebigdavid
unset name
echo $name # 输出空行变量类型
自定义变量局部变量 子进程不能访问的变量环境变量全局变量 子进程可以访问的变量
自定义变量-环境变量
namebigdavid
export name # 方法一
declare -x name # 方法二环境变量-自定义变量
export namebigdavid # 定义环境变量
declare x name # 改为自定义变量字符串
字符串可以用单引号也可以用双引号也可以不用引号 单引号与双引号的区别 单引号中的内容会原样输出不会执行、不会取变量双引号中的内容可以执行、可以取变量 namebigdavid
echo sd,$name # 输出 sd,$name
echo sd,$name # 输出 sd,bigdavid获取字符串长度
namebigdavid
echo ${#name} # 输出8提取子串
namebigdavid
echo ${name:0:3} # 提取从0开始的3个字符 输出bigTip: 1定义变量时等号两边不能有空格 2定义变量的时候变量都是字符串但当变量需要是整数时会自动把变量转换成整数 3被声明为只读的变量无法被unset删除 4字符串中不加引号和双引号效果相同 5如果一个变量不存在的话他的值是空字符串 6默认变量是局部变量自定义变量 7左闭右开取子串
4 默认变量
文件参数变量 在执行shell脚本时可以向脚本传递参数。 $1是第一个参数$2是第二个参数以此类推。特殊的$0是文件名包含路径 示例 创建文件vim test.sh
#! /bin/bash
echo 文件名$0
echo 第一个参数$1
echo 第二个参数$2
echo 第三个参数$3
echo 第四个参数$4执行脚本 chmod x test.sh ./test.sh 1 2 3 4 输出 文件名./test.sh 第一个参数1 第二个参数2 第三个参数3 第四个参数4 Tip:向脚本传递参数时参数个数超过一位需要用大括号括起来 echo ${10}
其它参数相关变量
$#:代表文件传入的参数个数
$*:由所有参数构成的用空格隔开的字符串 $1 $2 $3 $4
$:每个参数分别用双引号括起来的字符串如上例中值为$1 $2 $3 $4
$$:脚本当前运行的进程ID
$?:上一条命令的退出状态,0表示正常退出其他值表示错误。(不是stdout而是exit code)
$(command):返回command这条命令的stdout可嵌套 可嵌套 和 (不可嵌套) 区别是:可嵌套就是可以实现多个命令
#! /bin/bash
namebig
echo $(echo $name
namesd
echo $name)输出 bigdavid asd 5 数组
数组中可以存放多个不同类型的值只支持一维数组初始化时不需要指明数组大小。
数组下标从0开始。
定义
数组用小括号表示元素之间用空格隔开
array(1 abc def)
array[0]1
array[1]abc
array[2]def读取数组中某个元素的值 echo ${array[index]}
读取整个数组
${array[]} ${array[*]}
数组长度
${#array[]} ${#array[*]} Tip: 在读取整个数组时未定义的部分就不会显示。比如定义了array[0]array[1]array[2]array[1000],利用echo ${array[]}输出时只会显示我们定义的数组那4个元素的值。长度时结果是4而不是1000 6 expr命令
expr 表达式命令用于求表达式的值 用空格隔开每一项用反斜杠放在shell特定的字符前面发现表达式运行错误时可以试试转义对包含空格和其他特殊字符的字符串要用引号括起来expr会在stdout中输出结果。如果为逻辑关系表达式则结果为真时stdout输出1否则输出0expr的exit code如果为逻辑关系表达式则结果为真时exit code为0否则为1 字符串表达式
1length XXX:返回XXX的长度 2index XXX YYY:YYY中任意单个字符在XXX中最前面的字符位置下标从1开始。如果XXX中完全不存在YYY中的字符则返回0。 3substr XXX A B:返回XXX字符串中从A开始长度最大为B的子串。如果A或B为负数0或非数值则返回空字符串 示例
strHelloecho expr length $str #输出5
echo expr index $str l#输出3
echo expr substr $str 2 3#输出ell整数表达式
expr支持普通的算术操作 优先级字符串表达式 算术表达式 逻辑关系表达式 -:加减运算。两端参数会转换为整数如果转换失败则报错。* / %:乘除取模运算。两端参数会转换为整数如果转换失败则报错。 ():可以改变优先级但需要用反斜杠转义 a3
b4echo expr $a $b # 输出7
echo expr $a - $b # 输出-1
echo expr $a \* $b # 输出12*需要转义
echo expr $a / $b # 输出0整除
echo expr $a % $b # 输出3
echo expr \( $a 1 \) \* \( $b 1 \) # 输出20值为(a 1) * (b 1)逻辑关系表达式
| 如果第一个参数非空且非0则返回第一个参数的值否则返回第二个参数的值但要求第二个参数的值也是非空或非0否则返回0。如果第一个参数是非空或非0时不会计算第二个参数。:如果两个参数都非空且非0则返回第一个参数否则返回0。如果第一个参为0或为空则不会计算第二个参数。 ! :比较两端的参数如果为true则返回1否则返回0。””是””的同义词。”expr”首先尝试将两端参数转换为整数并做算术比较如果转换失败则按字符集排序规则做字符比较。():改变优先级但需要用反斜杠转义
Tip: (1)乘法运算的 * 的使用除转义外还有直接加单引号这种方式也可以
echo expr $a * $b(2)单引号表示原生字符串单引号里面的是啥就是啥双引号会把字符串格式化
strHello World!
echo expr length $str # 输出为4原始字符串$str
echo expr length $str # 输出为12变量值为Hello World!7 read命令
read命令用于从标准输入中读取单行数据。当读到文件结束符时exit code为1否则为0。 参数
-p: 后面可以接提示信息-t后面跟秒数定义输入字符的等待时间超过等待时间后会自动忽略此命令
read name# 读入name的值
bigdavid #标准输入
echo $name # 输出name的值
bigdavid #标准输出
read -p Please input your name: -t 3 name # 读入name的值等待时间3秒
Please input your name: bigdavid # 标准输入
echo $name # 输出name的值
bigdavid #标准输出Tip: -t 和 -p 的顺序不影响实际效果
8 echo命令
echo用于输出字符串。
显示普通字符串
echo sad
echo asd显示转义字符
echo \df\
echo \sd\显示变量
namebigdavid
echo sd is $name显示换行
echo -e hi\n # -e 开启转义显示不换行
echo -e Hi \c # -e 开启转义 \c 不换行显示结果定向至文件 将内容以覆盖的方式输出到output.txt中 echo Hello World output.txt原样输出字符串不进行转义或取变量(用单引号
namebigdavid
echo $name\显示命令的执行结果
echo date
echo $(date)Tip: 1查看echo相关转移字符在终端输入 help echo 2输出内容定向文件时哪里的文件都可以定向如果不是同一文件下那要把路径写清楚如果定向的文件不存在会默认给你新建一个文件 9 printf命令
printf命令用于格式化输出类似于C/C中的printf函数。 默认不会在字符串末尾添加换行符 格式 printf format-string [arguments...] 示例
printf %10d.\n 123 # 占十位右对齐
printf %-10.2f.\n 123.1234 # 占10位保留2位小数左对齐
printf %s bigdavid # 格式化输出字符串
printf %d * %d %d\n 2 3 expr 2 /* 310 test命令与判断符号[]
逻辑运算符和|| 表示与|| 表示或短路原则 (1)expr1 expr2当expr1为假时直接忽略expr2 (2)expr1 || expr2当expr1为真时直接忽略expr2表达式的exit code为0表示真为非零表示假。与C/C中的定义相反
test命令
终端输入help test或man test,查看test命令的用法。 1test命令用于判断文件类型以及对变量做比较。 2test命令用exit code返回结果而不是使用stdout。0表示真非0表示假。
文件类型判断
判断文件是否存在 格式test -e filename
测试参数代表意义-e文件是否存在-f是否为文件-d是否为目录
文件权限判断
判断文件是否可读 格式test -r filename
测试参数代表意义-r文件是否可读-w文件是否可写-x文件是否可执行-s是否为非空文件
整数间的比较
a是否等于b 格式test $a -eq $b
测试参数代表意义-eqa是否等于b-nea是否不等于b-gta是否大于b-lta是否小于b-gea是否大于等于b-lea是否小于等于b
字符串比较
测试参数代表意义test -z STRING判断STRING是否为空如果为空则返回truetest -n STRING判断STRING是否非空如果非空则返回true-n可以省略test str1 str2判断str1是否等于str2test str1 ! str2判断str1是否不等于str2
多重条件判定
格式test -r filename -a -x filename
测试参数代表意义-a两条件是否同时成立-o两条件是否至少一个成立!取反。如 test ! -x file当file不可执行时返回true
判断符号[]
[]与test用法几乎一模一样更常用于if语句中。另外[[]]是[]的加强版支持的特性更多 当使用[]出现[: -eq: unary operator expected的错误时可以使用[[]]。 [ 2 -lt 3 ] # 为真返回值为0
echo $? # 输出上个命令的返回值输出0Tip: []内的每一项都要用空格隔开中括号内的变量最好用双引号括起来中括号内的常数最好用单或双引号括起来 -eq equal相等 -ne not equal不等 -gt greater than大于 -ge greater than or equal大于或等于 -lt less than小于 -le less than or equal小于或等于 11 判断语句
if…then形式(类似于C/C中的if-else语句)
单层if
if condition
then语句1语句2...
fi单层if-else
if condition
then语句1语句2...
else语句1语句2...
fi多层if-elif-elif-else
if condition
then语句1语句2...
elif condition
then语句1语句2...
else语句1语句2...
ficase…esac形式
类似与C/C的switch语句 示例
a4case $a in1)echo ${a};; # 类似于C/C中的break2)echo ${a};;3)echo ${a};;*) # 类似于C/C中的defaultecho 其他;;
esac
12 循环语句
for...in...do...done
格式
for var in val1 val2 val3
do语句1语句2...
done实例 1输出a 2 cc每个元素一行
for i in a 2 cc
doecho $i
done2输出当前路径下的所有文件名每个文件名一行
for file in ls
doecho $file
done3输出1-10
for i in $(seq 1 10)
doecho $i
done4使用{1..10} 或者 {a..z}
for i in {a..z}
doecho $i
donefor ((…;…;…)) do…done
格式
for ((expression; condition; expression))
do语句1语句2
donefor ((i1; i10; i))
doecho $i
donewhile…do…done循环 格式
while condition
do语句1语句2...
done文件结束符为Ctrld输入文件结束符后read指令返回false
while read name
doecho $name
doneuntil…do…done循环
当条件为真时结束 格式
until condition
do语句1语句2...
done当用户输入yes或者YES时结束否则一直等待读入。
until [ ${word} yes ] || [ ${word} YES ]do read -p Please input yes/YES to stop this program: word done
break命令
跳出当前一层循环注意与C/C不同的是break不能跳出case语句。
实例
while read name
do for ((i1; i10; i))docase $i in8)break;;*)echo $i;;esacdonedone该示例每读入非EOF的字符串会输出一遍1-7。 该程序可以输入Ctrld文件结束符来结束也可以直接用Ctrlc杀掉该进程
continue命令
跳出当前循环 实例
for ((i1; i10; i))
doif [ expr $i % 2 -eq 0]thencontinuefiecho $i
done该程序输出1-10中的所有奇数
死循环的处理方式
遇到死循环输入Ctrlc 关闭进程
使用top命令找到进程的PID输入kill -9 PID即可关掉此进程ps aux返回当前打开的所有进程
13 函数
bash中的函数类似于C/C中的函数但return的返回值与C/C不同返回的是exit code取值为0-2550表示正常结束,注意区别。 函数的return值可以通过echo $?来获取 如果想获取函数的输出结果可以通过echo输出到stdout中然后通过$(function_name)来获取stdout中的结果。 格式
[function] func_name() {语句1语句2...
}不获取 return值和stdout值
func() {namebigdavidecho $name
}func获取 return值和stdout值
不写return时默认return 0
func() {namebigdavidecho $namereturn 123
}output$(func)
ret$?echo output $output
echo return $ret函数的输入参数
在函数内$1表示第一个输入参数$2表示第二个输入参数依此类推。 注意函数内的$0仍然是文件名而不是函数名 func() { # 递归计算 $1 ($1 - 1) ($1 - 2) ... 0wordwhile [ ${word} ! y ${word} ! n ]doread -p 要进入func($1)函数嘛?请输入y/n: worddoneif [ $word n ]thenecho 0return 0fiif [ $1 -le 0 ]thenecho 0return 0fisum $(func $(expr $1 - 1))echo $(expr $sum $1)
}echo $(func 10)函数内的局部变量
可以在函数内定义局部变量作用范围仅在当前函数内。 可以在递归函数中定义局部变量。 格式local 变量名变量值
#! /bin/bashfunc() {local namebigdavidecho $name
}
funcecho $name输出结果
bigdavid
第一行为函数内的name变量第二行为函数外调用name变量会发现此时该变量不存在 shell语法中函数的变量若无声明 就默认是全局变量 14 exit命令
exit命令用来退出当前shell进程并返回一个退出状态使用$?可以接收这个退出状态。
exit命令可以接受一个整数值作为参数代表退出状态。如果不指定默认状态值是 0。
exit退出状态只能是一个介于 0~255 之间的整数其中只有 0 表示成功其它值都表示失败。
创建脚本test.shvim test.sh
#! /bin/bashif [ $# -ne 1 ]
thenecho not validexit 1
elseecho validexit 0
fichmod x test.sh
./test.sh bigdavid #正常退出
echo $? # 0
./test.sh #不正常退出
echo $? # 1return和exit的共同之处都是返回exit code区别是return结束当前函数exit结束整个shell脚本 15 文件重定向
每个进程默认打开3个文件描述符
stdin标准输入从命令行读取数据文件描述符为0stdout标准输出向命令行输出数据文件描述符为1stderr标准错误输出向命令行输出数据文件描述符为2
可以用文件重定向将这三个文件重定向到其他文件中
重定向命令列表
命令说明command file将stdout重定向到file中command file将stdin重定向到file中command file将stdout以追加方式重定向到file中command n file将文件描述符n重定向到file中command n file将文件描述符n以追加方式重定向到file中
输入和输出重定向
echo -e Hello \c output.txt # 将stdout重定向到output.txt中
echo World output.txt # 将字符串追加到output.txt中read str output.txt # 从output.txt中读取字符串
echo $str # Hello World同时重定向stdin和stdout
#! /bin/bashread a
read becho $(expr $a $b)创建input.txt:vim input.txt 内容 3 4 chmod x test.sh
# 从input.txt中读取内容将输出写入output.txt中
./test.sh input.txt output.txt
cat output.txt # 查看output.txt中的内容ls -l 文件 列表的内容写入文件a.txt中 覆盖写ls -al 文件 列表的内容文件追加到文件aa.txt的末尾cat 文件1 文件2 将文件1的内容覆盖到文件2echo “内容” 文件 (将echo的内容追加到文件末尾) 16 引入外部脚本
类似于C/C中的includebash也可以引入其他文件的代码 格式
. filename # 注意点和文件名之间有一个空格
或
source filename示例 vim test1.sh
#! /bin/bash
namebigdavidvim test2.sh
#! /bin/bash
source test1.sh # . test1.sh
echo $name输出
bigdavid引入的文件可以添加路径比如使用绝对路径source /home/XXX/test1.sh 本文介绍了shell语法的常见用法不足之处望指正。