1. 整数运算
方法一:expr
expr 1 + 2
expr $num1 + $num2 + - \* / %
方法二:$(()) 整数运算
echo $(($num1+$num2)) + - * / %
echo $((num1+num2))
echo $((5-3*2))
echo $(((5-3)*2))
sum=$((1+2)); echo $sum
方法三:$[]
echo $[5+2] + - * / %
echo $[5**2] 5的二次方
方法四:let
let sum=2+3;
echo $sum
2. 小数运算
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc
方法一:expr
expr 1 + 2
expr $num1 + $num2 + - \* / %
方法二:$(()) 整数运算
echo $(($num1+$num2)) + - * / %
echo $((num1+num2))
echo $((5-3*2))
echo $(((5-3)*2))
sum=$((1+2)); echo $sum
方法三:$[]
echo $[5+2] + - * / %
echo $[5**2] 5的二次方
方法四:let
let sum=2+3;
echo $sum
2. 小数运算
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc
[root@tianyun ~]# url=www.sina.com.cn
[root@tianyun ~]# echo ${#url} 获取变量值的长度
15
[root@tianyun ~]# echo ${url} 标准查看
www.sina.com.cn
[root@tianyun ~]# echo ${url#*.} 从前往后,最短匹配
sina.com.cn
[root@tianyun ~]# echo ${url##*.} 从前往后,最长匹配 贪婪匹配
cn
引用的变量的时候做了一个匹配动作
[root@tianyun ~]# url=www.sina.com.cn
[root@tianyun ~]# echo ${url}
www.sina.com.cn
[root@tianyun ~]# echo ${url%.*} 从后往前,最短匹配
www.sina.com
[root@tianyun ~]# echo ${url%%.*} 从后往前,最长匹配 贪婪匹配
www
[root@tianyun ~]# url=www.sina.com.cn
[root@tianyun ~]# echo ${url#a.}
www.sina.com.cn
[root@tianyun ~]# echo ${url#*sina.}
com.cn
[root@tianyun ~]# echo $HOSTNAME
tianyun.uplooking.com
[root@tianyun ~]#
[root@tianyun ~]# echo ${HOSTNAME%%.*}
tianyun
[root@tianyun ~]# echo ${#url} 获取变量值的长度
15
[root@tianyun ~]# echo ${url} 标准查看
www.sina.com.cn
[root@tianyun ~]# echo ${url#*.} 从前往后,最短匹配
sina.com.cn
[root@tianyun ~]# echo ${url##*.} 从前往后,最长匹配 贪婪匹配
cn
引用的变量的时候做了一个匹配动作
[root@tianyun ~]# url=www.sina.com.cn
[root@tianyun ~]# echo ${url}
www.sina.com.cn
[root@tianyun ~]# echo ${url%.*} 从后往前,最短匹配
www.sina.com
[root@tianyun ~]# echo ${url%%.*} 从后往前,最长匹配 贪婪匹配
www
[root@tianyun ~]# url=www.sina.com.cn
[root@tianyun ~]# echo ${url#a.}
www.sina.com.cn
[root@tianyun ~]# echo ${url#*sina.}
com.cn
[root@tianyun ~]# echo $HOSTNAME
tianyun.uplooking.com
[root@tianyun ~]#
[root@tianyun ~]# echo ${HOSTNAME%%.*}
tianyun
"内容"的替换
[root@tianyun ~]# url=www.sina.com.cn
[root@tianyun ~]#
[root@tianyun ~]# echo ${url/sina/baidu}
www.baidu.com.cn
[root@tianyun ~]# url=www.sina.com.cn
[root@tianyun ~]#
[root@tianyun ~]# echo ${url/n/N}
www.siNa.com.cn
[root@tianyun ~]# echo ${url//n/N} 贪婪匹配
www.siNa.com.cN
变量的替代
${变量名-新的变量值}
变量没有被赋值:会使用“新的变量值“ 替代
变量有被赋值(包括空值): 不会被替代
[root@tianyun ~]# unset var1
[root@tianyun ~]#
[root@tianyun ~]# echo ${var1}
[root@tianyun ~]# echo ${var1-aaaaa}
aaaaa
[root@tianyun ~]# var2=111
[root@tianyun ~]# echo ${var2-bbbbb}
111
[root@tianyun ~]#
[root@tianyun ~]# var3=
[root@tianyun ~]# echo ${var3-ccccc}
变量没有被赋值:会使用“新的变量值“ 替代
变量有被赋值(包括空值): 不会被替代
[root@tianyun ~]# unset var1
[root@tianyun ~]#
[root@tianyun ~]# echo ${var1}
[root@tianyun ~]# echo ${var1-aaaaa}
aaaaa
[root@tianyun ~]# var2=111
[root@tianyun ~]# echo ${var2-bbbbb}
111
[root@tianyun ~]#
[root@tianyun ~]# var3=
[root@tianyun ~]# echo ${var3-ccccc}
1) if-then语句
if command
then
commands
[elif command
then
commands]
[else
commands]
fi
数值比较:
-eq 等于
-ge 大于等于
-gt 大于
-le 小于等于
-lt 小于
-ne 不等于
字符串比较:
=
!=
<
>
-n str1 #是否非0
-z str1 #是否为0
文件比较:
-d file #是否存在并是一个目录
-e file #是否存在
-f file #是否存在并是一个文件
-r file #是否存在并可读
-s file #是否存在并非空
-w file #是否存在并可写
-x file #是否存在并可执行
-O file #是否存在并属当前用户所有
-G file #是否存在并默认组与当前用户相同
-L filename 如果 filename为符号链接,则为真
-h filename 如果文件是软链接,则为真
file1 -nt file2 #file1是否比file2新
file1 -ot file2 #file1是否比file2旧
双圆括号(数学表达式放入比较)
val++ 后增
val-- 后减
++val 先增
--val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
>> 右位移
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或
双方括号(字符串比较)
if command
then
commands
[elif command
then
commands]
[else
commands]
fi
数值比较:
-eq 等于
-ge 大于等于
-gt 大于
-le 小于等于
-lt 小于
-ne 不等于
字符串比较:
=
!=
<
>
-n str1 #是否非0
-z str1 #是否为0
文件比较:
-d file #是否存在并是一个目录
-e file #是否存在
-f file #是否存在并是一个文件
-r file #是否存在并可读
-s file #是否存在并非空
-w file #是否存在并可写
-x file #是否存在并可执行
-O file #是否存在并属当前用户所有
-G file #是否存在并默认组与当前用户相同
-L filename 如果 filename为符号链接,则为真
-h filename 如果文件是软链接,则为真
file1 -nt file2 #file1是否比file2新
file1 -ot file2 #file1是否比file2旧
双圆括号(数学表达式放入比较)
val++ 后增
val-- 后减
++val 先增
--val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
>> 右位移
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或
双方括号(字符串比较)
()
子shell中执行
(()) 数值比较,运算 C语言
$() 命令替换
$(()) 整数运算
[] 条件测试
[[]] 条件测试,支持正则 =~
$[] 整数运算
(()) 数值比较,运算 C语言
$() 命令替换
$(()) 整数运算
[] 条件测试
[[]] 条件测试,支持正则 =~
$[] 整数运算
[root@yangs ~]# [[ "$USER" =~ ^r ]];echo $? //使用正则
0
===扩展正则表达式元字符
+ 匹配一个或多个前导字符 [a-z]+ove
? 匹配零个或一个前导字符 lo?ve
a|b 匹配a或b love|hate
() 组字符 love(able|rs) (ov)+
(..)(..)\1\2 标签匹配字符 (love)able\1er
x{m} 字符x重复m次 o{5}
x{m,} 字符x重复至少m次 o{5,}
x{m,n} 字符x重复m到n次 o{5,10}
* + ? 不能单独使用,必须配合前导字符或字符组。
支持不支持 虚拟化 64位 :
2. POSIX字符类:
表达式 功能 示例
[:alnum:] 字母与数字字符 [[:alnum:]]+
[:alpha:] 字母字符(包括大小写字母) [[:alpha:]]{4}
[:blank:] 空格与制表符 [[:blank:]]*
[:digit:] 数字字母 [[:digit:]]?
[:lower:] 小写字母 [[:lower:]]{5,}
[:upper:] 大写字母 [[:upper:]]+
[:punct:] 标点符号 [[:punct:]]
[:space:] 包括换行符,回车等在内的所有空白[[:space:]]+
三、正则匹配示例:vim
/love/ 正则匹配 模式
/^love/
/love$/
/l.ve/
/lo*ve/
/[Ll]ove/
/love[a-z]/
/love[^a-zA-Z0-9]/
/.*/ 整行
/^$/ 空行
/^[A-Z]..$/
/^[A-Z][a-z ]*3[0-5]/
/[a-z]*\./
/^ *[A-Z][a-z][a-z]$/
/^[A-Za-z]*[^,][A-Za-z]*$/
/\<fourth\>/
/\<f.*th\>/
:1,$ s/\([Oo]ccur\)ence/\1rence/
:1,$ s/\(square\) and \(fair\)/\2 and \1
/5\{2\}2\{3\}\./
+ 匹配一个或多个前导字符 [a-z]+ove
? 匹配零个或一个前导字符 lo?ve
a|b 匹配a或b love|hate
() 组字符 love(able|rs) (ov)+
(..)(..)\1\2 标签匹配字符 (love)able\1er
x{m} 字符x重复m次 o{5}
x{m,} 字符x重复至少m次 o{5,}
x{m,n} 字符x重复m到n次 o{5,10}
* + ? 不能单独使用,必须配合前导字符或字符组。
支持不支持 虚拟化 64位 :
2. POSIX字符类:
表达式 功能 示例
[:alnum:] 字母与数字字符 [[:alnum:]]+
[:alpha:] 字母字符(包括大小写字母) [[:alpha:]]{4}
[:blank:] 空格与制表符 [[:blank:]]*
[:digit:] 数字字母 [[:digit:]]?
[:lower:] 小写字母 [[:lower:]]{5,}
[:upper:] 大写字母 [[:upper:]]+
[:punct:] 标点符号 [[:punct:]]
[:space:] 包括换行符,回车等在内的所有空白[[:space:]]+
三、正则匹配示例:vim
/love/ 正则匹配 模式
/^love/
/love$/
/l.ve/
/lo*ve/
/[Ll]ove/
/love[a-z]/
/love[^a-zA-Z0-9]/
/.*/ 整行
/^$/ 空行
/^[A-Z]..$/
/^[A-Z][a-z ]*3[0-5]/
/[a-z]*\./
/^ *[A-Z][a-z][a-z]$/
/^[A-Za-z]*[^,][A-Za-z]*$/
/\<fourth\>/
/\<f.*th\>/
:1,$ s/\([Oo]ccur\)ence/\1rence/
:1,$ s/\(square\) and \(fair\)/\2 and \1
/5\{2\}2\{3\}\./
2)case命令
case variable in
patern1| patern2) commands1;;
patern3) command2;;
*) default commands;;
esac
3)for命令
for var in list
do
commands
done
#使用转义字符(反斜线)来将单引号转义;使用双引号来定义用到单引号的值或有空格的值
#IFS更改字段分隔符
for ((variable assignment; condition; iteration process))
4)while命令
while test command
do
other commands
done
5)until命令
until test commands
do
other commands
done
break [n(1当前循环 2下一级外部循环)]
continue [n(指定要继续哪级循环)]
5)select 命令
select var in ... ; do
break
done
.... now $var can be used ....
6)变量说明:
$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$? 最后运行的命令的结束代码(返回值)
$- 使用Set命令设定的Flag一览
$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$# 添加到Shell的参数个数 (echo ${!#} 参数为零时返回脚本名)
$0 Shell本身的文件名
$1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
find . -name "*.py" -exec mv {} {}x \;
7)getopt optstring options parameters #接受一系列任意形式的命令行选项和参数,并自动将他们转换成适当的格式。
getopts option_string variable
如果optstring不以”:“开头,invalid option错误和miss option argument错误都会使varname被设成?,$OPTARG是出问题的option。
optstring option字符串,会逐个匹配
varname 每次匹配成功的选项
arg 参数列表,没写时它会取命令行参数列表
$OPTIND 特殊变量,option index,会逐个递增, 初始值为1
$OPTARG 特殊变量,option argument,不同情况下有不同的值
8)获得用户输入
echo -n 'Enter name:'
read name
-p #指定多个变量
read -p 'Enter name:' #可放入特殊变量REPLY中。
-t #指定一个计时器(秒数),过期后返回一个非零退出状态码
-nl #接受单个字符后退出
-s #隐藏方式读取
while read line # while循环会继续通过read命令处理文件中的行。
9)function
function name {
commands
}
name() {
commands
}
7)getopt optstring options parameters #接受一系列任意形式的命令行选项和参数,并自动将他们转换成适当的格式。
getopts option_string variable
如果optstring不以”:“开头,invalid option错误和miss option argument错误都会使varname被设成?,$OPTARG是出问题的option。
optstring option字符串,会逐个匹配
varname 每次匹配成功的选项
arg 参数列表,没写时它会取命令行参数列表
$OPTIND 特殊变量,option index,会逐个递增, 初始值为1
$OPTARG 特殊变量,option argument,不同情况下有不同的值
8)获得用户输入
echo -n 'Enter name:'
read name
-p #指定多个变量
read -p 'Enter name:' #可放入特殊变量REPLY中。
-t #指定一个计时器(秒数),过期后返回一个非零退出状态码
-nl #接受单个字符后退出
-s #隐藏方式读取
while read line # while循环会继续通过read命令处理文件中的行。
9)function
function name {
commands
}
name() {
commands
}