变量使用定义
a=1
a=`curl -s https://testerhome.com/topics | grep "data-prefetch" | awk -F ‘"‘ ‘{print $4}‘`#将执行结果赋值给a
- 等号左右不能有空格
- 如果内容有空格,需要使用引号或者上引号
- 双引号支持转义 $开头的变量会被自动替换
- 用{}区分引用变量
#屏幕输出a
echo $a
#屏幕输出d $a
echo ‘d $a‘
#屏幕输出d 1 ,a被加载
echo "d $a"
#屏幕输出,不需要空格时,区分引用,用{}
echo ${a}_1
预定义变量
echo $PWD
echo $USER
echo $HOME#主目录
echo $PATH#环境变量
数组变量
a=(1 2 3 4)#定义数组
echo ${a[@]}#屏幕打印整个数组
echo ${a[*]}#屏幕打印整个数组
echo ${#a[@]}#屏幕打印整个数组长度
which python #查找安装目录,只能查找到环境变量的里面
touch 1.sh #创建1.sh文件
a=`ls` #反引号将命令执行结果赋值给a
echo $a#输出命令执行的结果
a=(`ls`)#将命令执行结果赋值给数组a
echo ${a[*]}#屏幕打印整个数组
echo ${a[0]}#屏幕打印第一个元素
特殊符号的使用
- 双引号用于括起一段字符串值,支持$var形式的变量替换
- 单引号也标识起内容字符串值,不支持转义
- \反斜线,某些情况下表示转义
- -e开启转义
- $(ls)标识执行ls后的结果,与``类似,不过可以嵌套
- `翻译韩,代表命令的输出
- $(())对变量进行操作,比如相加$((a+b)) $((2+3))
- (())是整数扩展,吧里面的变量当做整数去处理
- ({1..10})等价于seq 1 10.表示1到10
- $? 上个执行语句是否成功,成功等于0
echo -e ‘123\n456‘#-e开启转义
a=4
b=6
((a<b))
echo $?#打印上个执行语句执行结果
字符串操作
s="hello frome home"
echo ${s:6}#切片,从下标6位开始输出,也就是切去前6位,输出:frome home
echo ${s:6:3}#切片,从下标6位开始输出3个,输出:fro
echo ${s#hello}#从头部去除#后面的内容,输出: frome home
echo ${s#*o}#从头部去除根据匹配项匹配的第一个之前的所有内容,包含这个匹配项一同去除。输出: frome home
echo ${s##*o}#从头部贪婪匹配,匹配最后一个匹配项,包含自己之前的内容全部去除
echo "${s%datong}"#从尾部去除#后面的内容,输出:hello from
echo "${s%r*}"#从尾部开始去除#后面的内容,输出:hello f
echo "${s%%o*}"#从尾部贪婪匹配,匹配最后一个匹配项,包含自己之后的内容全部去除
echo "${s/o/8}"#从头部匹配第一个o,替换为8
echo "${s//o/8}"#从头部匹配全部o,替换为8
算术判断
[ 3 -eq 3 ];echo $?#判断是否相等,输出0
[ 3 -ne 3 ];echo $?#判断是否不等,输出1
[ 3 -gt 3 ];echo $?#判断是否大于等于,输出1
[ 3 -ge 3 ];echo $?#判断是否大于等于,输出0
[ 3 -lt 3 ];echo $?#判断是否小于,输出1
[ 3 -le 3 ];echo $?#判断是否小于等于,输出0
[ 3 -gt 2 -a 1 -lt 2 ];echo $?#-a相当于与
[ 3 -gt 2 -o 4 -lt 2 ];echo $?#-a相当于或
[ ! 2 -gt 1 ];echo $?#!相当于非
内置判断
- -e file 如果文件存在,则为真
- -d file 如果文件是一个子目录,则为真
- -f file 如果文件是一个普通文件,则为真
- -r file 如果文件可读,则为真
- -s file 如果文件的长度不为0,则为真
- -w file 如果文件可写,则为真
- -x file 如果文件可执行,则为真
[ -e 1.sh ] #判断1.sh是否存在
IF结构
- if [ 判断条件 ];then ...;fi
- if [ 判断条件 ];then ...;else ...;fi
- if [ 判断条件 ];then ...;elif [ 判断条件 ];then ...;fi
if [ 2 -gt 1 ];then echo "dadada";fi
if [ 2 -gt 3 ];then echo "dadada";else echo "sd";fi
if [ 2 -gt 3 ];then echo "dadada";elif [ 3 -gt 1 ];then echo "cv";fi
For循环
for ((i=0;i<10;i++));do echo $i;done
While循环
i=0
while [ $i -lt 10 ];do echo $i;((i++));done
while read x;do echo $x;done < 1
#读取1里面的文件
#<输出重定向
#>输入重定向
退出控制
break:
for ((i=0;i<10;i++));do if [ $i -lt 3 ];then echo $i;else break;fi;done
continue:
i=0;while [ $i -lt 5 ];do if [ $i -eq 3 ];then ((i++));continue;else echo $i;fi;((i++));done
Bash运行环境
bash:开启一个子shell
exit:退出子shell
(a=1):在子shell中a赋值,完成后消亡
(a=2;echo $a);echo $a#在子shell中a赋值,完成后消亡
{ a=1;echo $a; };echo $a#在本shell中a赋值
&:将当前程序放在后台运行
sleep 5&#后台运行,等待5s
sleep 20 #ctrl+z,隐藏到后台
bg 1 #开始为1的任务
fg 1 #将后台为1的任务调到前台
环境变量
创建目录:
mkdir test#创建test文件夹
cd test/#进入test文件夹
创建文本
vim wulala.sh#创建wulala.sh文件并进入编辑模式
#按esc退出编辑模式
:w#保存,不退出vim
:wq#保存并退出
:q#不保存退出
:q!#不保存强制退出
删除文件:
rm test
rm -f test #强制删除,无需询问
rm -fr ./* #删除当前目录下所有文件
rm -f *.txt #删除目录下所有txt文件
rm -rf /var/log/httpd/access #将会删除/var/log/httpd/access目录以及其下所有文件、文件夹
#-r 就是向下递归,不管有多少级目录,一并删除
#-f 就是直接强行删除,不作任何提示的意思
增加执行权限
chmod +x wulala.sh#增加可执行权限
bash wulala.sh #子shell执行这个文件
增加环境变量
在根目录用vim打开.bash_profile文件,添加以下内容:
export PATH=$PATH:/root/test
保存退出后,执行以下命令:
source ~/.bash_profile#重新读取文件,使其生效
重定向和追加
echo "hello world" > 1#覆盖写入1
cat 1
echo "hahaha" >> 1#追加写入1
cat 1
grep、awk、sed(搜索、切割、替换)
在文件当前目录下搜索文件内容:
grep "ma" 1.txt#匹配1.txt中带ma的内容
grep -i "ma" 1.txt# 匹配1.txt中带ma的内容,不区分大小写
cat 1.txt | grep "hi"#管道命令,匹配
cat 1.txt | grep -o "hi"#只显示匹配内容
cat 1.txt | grep -io "hi"#只显示匹配内容,不区分大小写
echo 123456789 | grep "3"
echo 123456789 | grep "3."#向后多显示1个字符
echo 123456789 | grep "3.."#向后多显示2个字符
echo 123456789 | grep "3.*"#向后显示全部字符
curl获取网页源代码----grep
curl http://www.baidu.com
curl -s http://www.baidu.com/s?wd=12306 | grep -o "结果约." #只显示结果约后面一个数字
curl -s http://www.baidu.com/s?wd=12306 | grep -o "结果约[0-9]" #只显示结果约后面一个数字
curl -s http://www.baidu.com/s?wd=12306 | grep -o "结果约[0-9,]*" #,标识或者,*标识匹配到全部
cat 1.txt | grep -o "d:[0-9,]*" | grep -o "[0-9,]*"
while read k;do echo $k;curl -s http://www.baidu.com/s?wd=$k;done<baidu.word | grep -o "结果约[0-9,]*"
awk
echo "123|456|789" | awk -F ‘|‘ ‘{print $0}‘#-F,指定以‘|‘为分隔符分割,‘{print $0}‘为指定语法。$0为全部显示
echo "123+456-789" | awk -F ‘+|-‘ ‘{print $0}‘
##此时‘+|-‘匹配+或者-。
cat passwd | awk ‘{print $1}‘ #不用-F,默认以“ ”空格为分割
cat passwd | awk -F ‘:‘ ‘{print $1,$2}‘#以print 后面的形式输出$1和$2数据
sed
echo "hi lili hi" | sed ‘s/hi/hello/‘#只替换第一个
echo "hi lili hi" | sed ‘s/hi/hello/g‘#替换所有
sed ‘s/1/2/g‘ 1.txt#替换文件内容,但是这个原文件不变
sed -i ‘s/1/2/g‘ 1.txt#替换文件内容,改变原文件
sed -i.sd ‘s/1/2/g‘ 1.txt#替换源文件内容,且将源文件备份一个.sd文件
#BEGIN{}{}END{}用法:
#格式:awk -F: ‘BEGIN {处理文件前执行的代码块} {处理文件过程中执行的代码块} END {处理文件后执行的代码块}‘ filename
awk -F ":" ‘BEGIN {print "这是第一行"} {print($0)} END {print "这是最后一行"}‘ /etc/passwd
cat /etc/passwd | awk -F ":" ‘BEGIN{i=1}{print(i,$1);i++}END{print("END")}‘
脚本
创建脚本并执行
vim 1.sh#输入一下内容保存
chmod +x 1.sh#增加执行权限
1.sh 1 2 3 4 5#运行这个脚本,无法运行是因为当目录不在环境变量中,添加环境变量
echo "获取脚本执行的参数:$0";
echo "获取第一个参数:$1";
echo "获取第二个参数:$2";
echo "获取参数的个数:$#";
echo "获取到的参数(str):$*";
echo "获取到的参数(每一个参数都是一个str):$@";
echo "获取当前进程的PID:$$";
#$*和$@的区别是,$*返回的是一个整体,$@返回的是一个一个单独的
获取输入
read -p "输入:" h;echo "您输入的是$h"# read -p等待输入
创建函数脚本
functest(){
echo "第一参数为$1"
echo "第二参数为$2"
echo "第十参数为${10}"#引用9以上的参数用中括号
echo "参数总个数$#"
}
functest 1 2 3 4 5 6 7 8 9 10 11
将上述内容保存为functest.sh文件。
运行方式
- 增加当前目录到环境变量,直接使用functest.sh
- 使用子shell运行:bash functest.sh
- 增加运行权限:chmod -x functest.sh 然后当前目录运行./functest.sh
练习1:打印输入数据,当输入exit,退出
functest(){
while true
do
read -p "请输入:" h;
if [ $h == "exit" ]
then break
else
echo "您输入的是$h"
fi
done
}
functest
练习2:打印输入2个数据的加减乘除
test(){
while true
do
read -p "请输入2个数字,用空格隔开" nub1 nub2
if [ $nub1 == "exit" ]
then break
else
echo "$nub1+$nub2="$(($nub1+$nub2))
echo "$nub1-$nub2="$(($nub1-$nub2))
echo "$nub1*$nub2="$(($nub1*$nub2))
echo "$nub1/$nub2="`awk "BEGIN{print \"$nub1\"/\"$nub2\"}"`
fi
done
}
test