bash中文手册学习
2018-04-25 23:48:50 19 举报
AI智能生成
linux下bash中文手册
作者其他创作
大纲/内容
高级用法
eval 功能是生成代码
用途:把字符串直接解析成代码然后执行
用途:把字符串直接解析成代码然后执行
转化成命令举例:
mycmd1="find . -name *.sh"
mycmd2="grep -rnH "fp-rte""
eval ${mycmd1} | ${mycmd2}
最终的效果是执行命令
mycmd1="find . -name *.sh"
mycmd2="grep -rnH "fp-rte""
eval ${mycmd1} | ${mycmd2}
最终的效果是执行命令
转化成代码举例:
FGUO_PATH1=/home/fengtian/self_develop
num=1
mypath=FGUO_PATH${num} #FGUO_PATH1
realpath=$(eval echo \$\{$mypath\})
#转化成代码realpath=/home/fengtian/self_develop
FGUO_PATH1=/home/fengtian/self_develop
num=1
mypath=FGUO_PATH${num} #FGUO_PATH1
realpath=$(eval echo \$\{$mypath\})
#转化成代码realpath=/home/fengtian/self_develop
newpath=/home/bangyun/test
eval ${mypath}=${newpath}
#FGUO_PATH1=/home/bangyun/test
eval ${mypath}=${newpath}
#FGUO_PATH1=/home/bangyun/test
语法规则:
1 先是bash解析${var}成真正的数据
2 然后eval把它转换成代码
eval ${mypath}=${newpath}
1 先是bash解析${var}成真正的数据
2 然后eval把它转换成代码
eval ${mypath}=${newpath}
case测试结构
格式:
case "$value" in
"apple")
cmd1
cmd2
;; #表示结束相当与break
"banana")
cmd3
cmd4
;;
esas
case "$value" in
"apple")
cmd1
cmd2
;; #表示结束相当与break
"banana")
cmd3
cmd4
;;
esas
问题
bash里面正则表达式规则
bash总体介绍
行首指定解释器
#! /bin/bash (linux系统下默认的解释器)
#! /bin/bash (linux系统下默认的解释器)
bash的使用范围和特点
注意要使用 bash 来执行脚本, 不推荐sh执行
bash ./fguo_test.sh
bash ./fguo_test.sh
特殊字符
管道符号 |
1 管道是将第一个命令的输出导出,做为第二个命令作为输入
2 管道是在同一个子进程中运行的, 因此不能修改父进程的变量
命令后台运行 &
当命令尾部跟随'&'表示命令进行后台运行
重定向输入输出(就是减号) -
1 利用管道将标准输出重定向到其他命令中
grep -rnH "ospfd" syslog | diff my_log.txt -
解释: 1 grep搜索结果输出到标准输出.
2 diff 比较my_log.txt 和前面的grep结果
% 操作符有2种用途:
1 数字计算时取模 z=5%3 (结果是2)
2 模式匹配操作符
命令分隔符(就是分号) ;
同一行中使用多条命令, 需要用';' 分隔
命令替换符(反引号): `command`
用途: 将命令的输出结果作为变量赋值给另一个变量
双圆括号结构: (())
表示进行数学运算
表示进行数学运算
取值符号 (就是美元符号)$
用途: 用来取出变量的内容
4章 变量与参数
变量替换:
引用变量值的过程称为变量替换
变量名实际上是一个指针,它指向真正存储数据的内存地址
1 规则: 变量赋值时(=赋值符号的两边)决不能带空格
var1="tool"
var2=${var1}
var3=${var1/ool/ooth} 将"tool"替换成了"tooth"
2 字符串的强引用(''单引号包含)和弱引用(双引号包含)
echo "$var1" # 输出的是var1变量的值test
echo '$var1' #输出的是单纯字符串$var1
变量赋值: = (使用等号赋值,但是等号‘=’两端不能有空格)
1 直接赋值: var0='myfile'
2 反引号命令赋值: var1=`ls -l`
3 高级版命令赋值: var2=$(ls -l)
4 for循环中赋值: for var3 in 1 3 5
5 read赋值: read var4
结构中赋值:
{read var1
read var2
} < /var/tmp/log
功能解释:从文件/var/tmp/log中
读取第1行到var1变量,第2行到var2里
{read var1
read var2
} < /var/tmp/log
功能解释:从文件/var/tmp/log中
读取第1行到var1变量,第2行到var2里
4.3 Bash变量是弱类型的
规则: Bash是不区分变量类型的, 本质上都是字符串, 只要字符串中含有数字就进行数字运算
A=1234
let "A = A+ 2" #结果A=1236
规则: Bash是不区分变量类型的, 本质上都是字符串, 只要字符串中含有数字就进行数字运算
A=1234
let "A = A+ 2" #结果A=1236
特殊类型的变量
环境变量: 用于不同脚本之间共享变量
1 export 命令把当前设置的环境变量更新出去
2 子进程会继承父进程的环境变量
1 export 命令把当前设置的环境变量更新出去
2 子进程会继承父进程的环境变量
位置变量表示传给脚本的参数: $0 $1 $2 .. ${10}
$0表示脚本的第一个参数,是脚本名
$# 表示所有参数的总个数, 不含第一个参数脚本名称
$@ 表示所有传递给该脚本的参数
shift命令将全部参数向左移动1个:
原始参数$1,$2,$3
移动之后原始$1被删除了,$1是原来的$2, $3是原来的$2
原始参数$1,$2,$3
移动之后原始$1被删除了,$1是原来的$2, $3是原来的$2
引用
字符串引用: 包含2种
1 (双引号)"“ 表示部分引用, 字符串中大部分特殊字符会被特殊解析处理
2 (单引号) ‘ 表示全引用, 字符串中即使有特殊字符,也不会做特殊解析处理
1 (双引号)"“ 表示部分引用, 字符串中大部分特殊字符会被特殊解析处理
2 (单引号) ‘ 表示全引用, 字符串中即使有特殊字符,也不会做特殊解析处理
1 双引号举例:"This is ${var1}"
特殊符号${}会被特殊解释处理,替换为其指向的实际内容
特殊符号${}会被特殊解释处理,替换为其指向的实际内容
转义字符:
解释: 当字符不是字面的含义时
1 echo -e '\rABC\nXXX' 使用-e参数后可以使用转义字符
测试结构
if 测试状态
#可以是命令返回值也可以是测试结构[]
then
command1
command2
else
cmd10
cmd11
if
1 测试结构命令[]举例:
if [ "abc" ]
then
ls -l
fi
2 测试命令返回值举例:
if grep "abc"
then
echo "grep test1"
fi
测试状态-> 使用测试结构: [] (就是方括号)表示测试命令,
相当于test命令
相当于test命令
测试状态 -> 算数表达式的测试结果是双元括号: (())
((100||20)) #表示算数运算或
测试文件:
-e 测试文件是否存在
-f 文件是普通文件,不是目录之类
其他比较
字符串比较:
[ ${str10} == ${str20} ] #表示相等
[ ${str10} != ${str20} ] #表示不相等
复合比较: && 表示与 || 表示或
if [ ${str30} != "apple" ] && [ ${str30} != "banana"]
then
command1
command2
fi
if [ ${str30} != "apple" ] && [ ${str30} != "banana"]
then
command1
command2
fi
整数比较:
1 传统比较: -eq (相等), -gt (大于), -lt (小于), -ne (不相等)
[ ${var1} -gt ${var2} ] #表示var1大于var2
2 使用双圆括号表示数字比较
(( ${var10} >= ${var20}))
其他测试
-z 测试字符串长度为0
if [ -z ${str} ]
-n 测试字符串非空,
注意字符串变量需要在双引号之内
注意字符串变量需要在双引号之内
if [ -n "${str}"]
退出和退出状态:
1 退出的返回值: exit 2
2 $? #表示最后一个命令的退出状态, 如果是函数的话,就是的返回值
2 $? #表示最后一个命令的退出状态, 如果是函数的话,就是的返回值
循环结构
for var in [list]
do
cmd1
cmd2
done
举例:
for var in "abc" "x1" "y1"
[list] 中允许含有通配符
while [ condition ]
do
command(s)...
done
do
command(s)...
done
条件判断
字符串处理
字符串长度:
${#str1} 取得字符串的长度
${#str1} 取得字符串的长度
字符串截取:
规则: ${string:start_position: length} 位置可以是负值,表示从最右边开始算
把字符串${string}的值进行截取, position是起始索引位置.
length是截取的长度,不指定的话就是剩余全部长度
规则: ${string:start_position: length} 位置可以是负值,表示从最右边开始算
把字符串${string}的值进行截取, position是起始索引位置.
length是截取的长度,不指定的话就是剩余全部长度
举例:
string="abcdedf"
${string:1} -> ”bcdef“
${string:1:2} -> ”bc“
负值举例:
string="ABCDEF12345"
${string:(-2)} -> "45"
string="ABCDEF12345"
${string:(-2)} -> "45"
字符串删除子字符串:
规则:
1.1个'#'表示最短字符串匹配
${string#delete_short_str}
2. 2个'##' 表示最长字符串匹配
${string##del_long_str}
3. 1个'%'表示从尾部开始最短匹配
4. 2个’%%‘表示从尾部开始最长匹配
规则:
1.1个'#'表示最短字符串匹配
${string#delete_short_str}
2. 2个'##' 表示最长字符串匹配
${string##del_long_str}
3. 1个'%'表示从尾部开始最短匹配
4. 2个’%%‘表示从尾部开始最长匹配
1 举例:
string="abcdef12345UVWYZabcd"
str2=${string#a*d} -> "ef12345UVWYZabcd"
string="abcdef12345UVWYZabcd"
str2=${string#a*d} -> "ef12345UVWYZabcd"
2 举例:
string="abcdef12345UVWYZabcd987"
str2=${string##a*d} -> "987"
string="abcdef12345UVWYZabcd987"
str2=${string##a*d} -> "987"
3 举例从右开始匹配字符串:
str4="abcdef12345UVWYZabcd98239207"
str4_del=${str4%9*7} -> "abcdef12345UVWYZabcd9823"
str4="abcdef12345UVWYZabcd98239207"
str4_del=${str4%9*7} -> "abcdef12345UVWYZabcd9823"
命令替换:
本质上是启动一个子进程执行该命令
2种格式
1 var1=$(ls -l)
2 var2=`ls -l`
I/O重定向
M > N
#表示把文件M的输出重定向到文件N里,
1 如果M指定, 表示标准输出stdout
2 该条命令结束后, 重定向也结束并恢复
M > &N
#表示把文件M输出重定向到文件N里,
从此以后所有输出都被重定向
#表示把文件M输出重定向到文件N里,
从此以后所有输出都被重定向
1 关闭输入文件M: M<&-
2 关闭输出文件N: N>&-
2 关闭输出文件N: N>&-
cmd < file
把文件作为命令的输入
0表示stdin, 1 表示stdout, 2 表示stderr
0 条评论
下一页