变量
-
定义
a=test -
使用
a或
a或
a
或
{a} -
定义环境变量
export IP=12356 -
定义只读变量
readonly ip -
删除
unset
基本知识sh
-
$n
$1,$2可以获得传递的参数 也称为位置参数 ${10} 位置变量是从1开始的 -
#!
一个约定的标记,告诉系统这个脚本需要什么解释器执行 -
预先定义变量
-
$0
脚本名 这个是包括路径的 -
$*,$@
所有的参数-
#*以一个单字符串显示所有向脚本传递的参数。
如”$*“用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。 -
@与
@ 与
@
与
*相同,但是使用时加引号,并在引号中返回每个参数。
如”$@“用「”」括起来的情况、以”$1″ “
2”
…
”
2″ … ”
2
”
…
”
n” 的形式输出所有参数。 -
#*类似字符串,只有一个元素,
@类
似
列
表
,
有
多
个
元
素
这
个
特
点
只
在
”
@类似列表,有多个元素 这个特点只在”
@
类
似
列
表
,
有
多
个
元
素
这
个
特
点
只
在
”
*“和”$@”中体现出来,其它时候都保持一致
-
#*以一个单字符串显示所有向脚本传递的参数。
-
$#
参数的个数 -
$
当前进程的PID -
$!
上一个后台进程的PID -
$?
显示到此位置最后执行的命令的退出状态,0表示没有错误
-
-
字符串的更多操作
-
提取
${string:1:4} -
长度
${#string}
-
-
数组的更多操作
-
definition
array=(value1 value2 …) array=([name]=value)关联数组 -
访问
${array[n]} -
访问全部元素
${array[@]} -
长度
如果数组元素为一个字符串 ${#array[0]} -
数组长度
${#array[*]}
或
${#array[@]}
-
-
bash执行linux原生命令,并获取返回值
-
`command`
command代表linux命令,里面可以存在变量 -
$(command)
只是使用的形式不一样,但是command的意义是相同的 - 返回值是命令执行的结果
-
-
关系运算符
这个只支持数字,不支持字符串-
-eq
相等,
ne
不相等,
gt,lt
大于小于,
ge,le
大于等于或小于等于
-
-
逻辑运算符
逻辑运算符基本无差别 逻辑运算符
!,&&,||
-
字符串运算符
-
=,!=
字符串是否相等 -
-z,-n
判断字符串长度是否为0 -z为0返回true -n反之
[-z $a]
-
=~
正则比对
"user" =~ ^r
- 变量未定义或为空,在参与逻辑运算时默认为false
-
-
文件测试符
可以检测文件的状态如可读,可写等,具体使用省略-
-d dir 判读目录是否存在
[ -d path]
- -f file 判断文件是否存在
- -r|w|x file 判断是否有读执行写权限
-
-d dir 判读目录是否存在
-
输入输出重定向
-
>
重定向输出到某个位置,替换原有文件的所有内容。 -
>>
重定向追加到某个位置,在原有文件的末尾添加内容。 -
<
重定向输入某个位置文件。 -
2>
重定向错误输出。 -
2>>
重定向错误追加输出到文件末尾。 -
&>
混合输出错误的和正确的都输出。 -
<< tag
将开始标记tag和结束标记tag之间的内容作为输入
-
-
注释
-
#
单行注释 -
:<<s
s为任意一个字符 注释结尾要重复这个字符
-
-
生成序列
{1..254}
基本语法
-
if else
if [ condition ]
then
command
elif condition
then
command
else
command
fi
# 也可以形成一行
if condition;then echo "test";else echo "else";fi
-
for
for var in item1 item2 item3
do
command1
command2
...
done
# 另一种写法
for((i=1;i<=10;i++));
do
command
done
-
while
int=1
while(($int<=5))
do
command
done
#死循环
while true
do
command
done
#实例
while read line
do
done<ip.txt
-
until
无限循环直到条件为true 类似while
until condition
do
command
done
# 简单使用
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a +1`
done
-
case
;;代表switch中的break matchV支持正则表达式
case value in
matchV)
command
;;
matchV2)
command
;;
esac
# 简单使用
case $value in
1|2|3) echo 'choice 1'
;;
*) echo 'choice other number'
;;
esac
-
break,continue
正常使用 -
function
- 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
-
函数返回值在调用该函数后通过
$?
来获得。 -
调用函数时可以向其传递参数。在函数体内部,通过
n(
n
为
数
字
)
的
形
式
来
获
取
参
数
的
值
和
位
置
参
数
差
不
多
,
n(n为数字) 的形式来获取参数的值 和位置参数差不多,
n
(
n
为
数
字
)
的
形
式
来
获
取
参
数
的
值
和
位
置
参
数
差
不
多
,
#也有
funWithReturn(){
echo "这是一个函数"
echo "函数的第一个参数 $1 "
return "returnValue"
}
funWithReturn 1 2
echo "returnValue:$?"
-
. or source
文件包含,可以理解为将另一个文件包含进来
# 简单使用
. ./test.sh
#另一种写法
source ./test.sh
-
在脚本中调用其它解释器
/usr/bin/expect <<-EOF
set pass 1
set timeout 5 #设置连接反应超时时间
spawn ssh root@192.168.1.1
expect {
"yes/no" { send "yes\r" ; exp_continue}
"password:" {send "$pass\r"}
}
#interact 写上这个开启交互模式
expect "#" #自动执行
send "exit"
expect eof
EOF
变量的数值运算
-
整数运算
+ – * / %- expr 1 + 2
-
((
((
(
(
num1+$num2)) 可以使用c语言可以进行的运算 -
[[
[
num+1] - let sum=2+3或let i++
- 小数运算使用bc
内置函数
-
echo
-
-e
开启转义,也就是说\n可以被当成换行 -
显示命令执行的结果
echo
date
-
-
read
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 read name- -p 输入提示文字
- -n 输入字符长度限制(达到6位,自动结束)
- -t 输入限时
- -s 隐藏输入内容
-
printf
使用printf的移植性要比echo要好,printf和c语言的printf类似-
格式
printf format-string [arguments…],format-string: 为格式控制字符串 arguments:为参数列表。
-
-
let
Bash函数可以用来给变量自增 -
exit
退出程序
经常使用Linux命令
-
seq
创建序列
for var in `seq 10`
-
grep
字符串匹配命令 可以使用正则表达式,对输入内容的每一行进行匹配 返回匹配成功的行- -v 不包括 反向
-
sed
基本用法 对输入字符进行操作-
a,i,c,d,p,s
a代表后面新增一行,i代表在前面新增一行,c代表替换,d代表删 p代表打印 s取代可以使用正则表达式 -
数据的搜寻替换,显示等
sed 's/正则/content/g'
g代表行内全局替换,i代表忽略大小写,和正则一样 -
搜索
sed '/root/p'
可以使用正则表达式,也可以换其它参数 -
sed '2c Test'
-
-e
多点编辑
sed -e '3,$d' -e 's/bash/blueshell/'
-
-
wc
计算行数,字节数,单词数-
-clw
c字节数 l行数 w单词数
-
-
awk
文本分析工具 里面的写法类似c语言,可以使用正则表达式匹配-
BEGIN{},{},END{}
,{}代表进行中,BEGIN{}代表开始前执行的,END{}结束执行 -
awk -va=1 '{print $1,$1+a}' log.txt
-
awk -F, '{print $1,$2}' log.txt
-
-
expect
一个自动化的交互工具 可以实现很多操作,例如远程连接自动操作
常用全局环境变量(系统变量)
- $HOME home目录路径
- $SHELL shell解释器路径
- $LANG 操作系统语言和编码
- $RANDOM 随机生成 0~32767之间的整数数字
- $PATH 定义解释器搜索用户执行命令的路径
注意
-
bash不支持简单的
数学运算
,可以通过其他的linux命令实现如
expr
和
awk
val=`expr 2 + 2` 中间要加空格-
expr
expr的简单运算包括+,-,*,/,% 使用*号时要加上\*(这里为了配合markdown语法多写了几个)
-
-
并发执行
不影响当前shell
{command}&
&在linux中代表后台执行 -
/dev/null
如果将输出写到这里将会被丢弃